クラス

[戻る] [前に] [次に]

目次

クラス(class)

クラス(class)はオブジェクト指向プログラミングの基本的な仕組みを提供するもので、オブジェクト(インスタンス とも言います)が持つ、フィールド(属性アトリビュートプロパティ とも呼ばれます)や、メソッド(関数ファンクション と呼ばれることもあります)などを定義します。

class TestClass {
    TypeName FieldName;
    TypeName MedhotdName(Args) { ... }
}

クラスのインスタンス化(new)

あるクラスのインスタンスを作成するには、new を用います。例えば、TestClass という名前のクラスのインスタンスを作るには次のようにします。

TestClass o = new TestClass();

クラスの例

例えば下記の例では、Person という名前のクラスを定義しています。Person クラスは、myName と myAge というフィールドを持っています。SetName()、GetName()、SetAge()、GetAge() というメソッドを持っています。

class Person {
    String myName;
    int myAge;
    public void SetName(String name) {
        myName = name;
    }
    public String GetName() {
        return myName;
    }
    public void SetAge(int age) {
        myAge = age;
    }
    public int GetAge() {
        return myAge;
    }
}

ここで作成した Person クラスを使用するには次のようにします。まず、new でインスタンス tanaka や suzuki を作成し、そのメソッドを呼び出しています。

class PersonTest {
    public static void main(String[] args) {
        Person tanaka = new Person();          // 田中さんオブジェクトを作る
        tanaka.SetName("Tanaka");              // 田中さんの名前を設定する
        tanaka.SetAge(26);                     // 田中さんの年齢を設定する

        Person suzuki = new Person();          // 鈴木さんオブジェクトを作る
        suzuki.SetName("Suzuki");              // 鈴木さんの名前を設定する
        suzuki.SetAge(32);                     // 鈴木さんの年齢を設定する

        System.out.println(tanaka.GetName());  // 田中さんの名前を参照する
        System.out.println(tanaka.GetAge());   // 田中さんの年齢を参照する
        System.out.println(suzuki.GetName());  // 鈴木さんの名前を参照する
        System.out.println(suzuki.GetAge());   // 鈴木さんの年齢を参照する
    }
}

クラス、インスタンス、フィールド、メソッドについてまとめてみます。

用語別の呼び方サンプルでの具体例
クラス
Person
フィールド属性、アトリビュート、プロパティmyName、myAge
メソッドファンクション、関数SetName()、GetName()、SetAge()、GetAge()
インスタンスオブジェクトtanaka、suzuki

コンストラクタ

コンストラクタ は、クラス名と同じ名前を持つ特別なメソッドです。インスタンスが生成された時に自動的に呼ばれ、インスタンスの初期化処理を行います。

class Person {
    String myName;
    Person(String myName) {
        this.myName = myName;
    }
}

コンストラクタには上記のように引数を持つことができます。下記の例では、Person クラスのインスタンス tanaka を生成する際に、コンストラクタの処理を利用して名前(myName)の設定を行っています。

Person tanaka = new Person("tanaka");

デストラクタ

デストラクタ は、クラスが消滅する際に自動的に呼ばれる特別なメソッドで、クラスの後始末処理を記述します。C++言語などではサポートされていますが、Java ではすべての破棄作業は自動的に行われるという思想の元、デストラクタは不要と考えられています。

インナークラス

クラス内部に定義するクラスを インナークラス(内部クラス)と呼びます。

class OuterClass {
    class InnerClass { }
}

public class Main {
    public static void main(String[] args) {
        OuterClass o = new OuterClass();
        OuterClass.InnerClass o2 = o.new InnerClass();
    }
}

static をつけて使用することが多いかと思います。

class OuterClass {
    static class InnerClass { }
}

public class Main {
    public static void main(String[] args) {
        OuterClass.InnerClass o2 = new OuterClass.InnerClass();
    }
}

クラス修飾子(public, ...)

クラスの修飾子には、publicfinalabstractstrictfp を指定することができます。

修飾子 class クラス名 {
    :
}

インナークラス(クラス内部に定義するクラス)には加えて、protectedprivatestatic を指定することが可能になります。

class クラス名 {
    修飾子 class クラス名 {
        :
    }
}

クラスの継承(extends)

クラスは親子関係を持ち、親クラス (スーパークラス) を 子クラス (サブクラス)が 継承 することができます。継承するにはサブクラスを定義する際に extends を使用します。サブクラスはスーパークラスのフィールドやメソッドをそのまま引き継ぐことができます。

class SuperClass {                                        // 親クラス
    void method1() { System.out.println("method1"); }
}

class SubClass extends SuperClass {                     // 子クラス
    void method2() { System.out.println("method2"); }
}

public class Main {
    public static void main(String[] args) {
        SubClass o = new SubClass();
        o.method1();                    // 親クラスのメソッドも呼び出せる 
        o.method2();                    // 子クラスのメソッドも呼び出せる
    }
}

親クラスの参照(super)

super は親クラスを意味します。親クラスのコンストラクタは、引数を持たない場合は子クラス作成時に暗黙的に呼び出されますが、引数を持つ場合は暗黙的に呼び出されないため、下記の様に明示的に呼び出す必要があります。

class SuperClass {
    String name;
    SuperClass(String name) { this.name = name; }
    void printName() { System.out.println(this.name); }
}

class SubClass extends SuperClass {
    SubClass(String name) {
        super(name);                        // 親クラスのコンストラクタを呼び出す
        System.out.println(super.name);     // 親クラスのフィールドを参照する
        super.printName();                  // 親クラスのメソッドを呼び出す
    }
}

クラスに属しているか調べる(instanceof)

instanceof 演算子は、オブジェクト(インスタンス)が、指定したクラスまたはその上位のクラスに属しているかどうかを調べます。

SubClass o = new SubClass();
if (o instanceof SuperClass) {
    System.out.println("属してます");
}

ジェネリック

型の情報を引数の様に渡すことで、未定の型に対するクラスを定義することができます。これを ジェネリック と呼びます。下記の例では Test というクラスは T という型引数を取り、T の型によってフィールドの型などを柔軟に変更することができます。

class Test<T> {
    T value;
    Test(T value) {
        this.value = value;
    }
}

public class Main {
    public static void main(String[] args) {
        Test<String>t1 = new Test<String>("ABC");
        Test<Integer>t2 = new Test<Integer>(123);
        System.out.println(t1.value);
        System.out.println(t2.value);
    }
}

よく使用される例は、Integer のリスト、String のリストなどを扱うパターンです。

import java.util.List;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        List<String>list = new ArrayList<String>();
        list.add("AAA");
        list.add("BBB");
        list.add("CCC");
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
    }
}

Java 7 からは右辺の型を省略できるようになりました。

List<String>list = new ArrayList<>();

http://www.tohoho-web.com/java/class.htm
初版:2004年6月26日、最終更新:2004年11月28日
[戻る] [前に] [次に]