クラス(class)はオブジェクト指向プログラミングの基本的な仕組みを提供するもので、オブジェクト(インスタンス とも言います)が持つ、属性(アトリビュート、プロパティ とも呼ばれます)や、メソッド(関数、ファンクション と呼ばれることもあります)などを定義します。
class クラス名 { 型 属性; : 型 メソッド() { ... } : }
あるクラスのインスタンスを作成するには、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 name) { myName = name; } }
コンストラクタには上記のように引数を持つことができます。下記の例では、Person クラスのインスタンス tanaka を生成する際に、コンストラクタの処理を利用して名前(myName)の設定を行っています。
Person tanaka = new Person("tanaka");
デストラクタ は、クラスが消滅する際に自動的に呼ばれる特別なメソッドで、クラスの後始末処理を記述します。C++言語などではサポートされていますが、Java ではすべての破棄作業は自動的に行われるという思想の元、デストラクタは不要と考えられています。
クラス内部に定義するクラスを インナークラス(内部クラス)と呼びます。
class クラス名 { class クラス名 { : } }
クラスの修飾子には、public、final、abstract、strictfp を指定することができます。
修飾子 class クラス名 { : }
インナークラス(クラス内部に定義するクラス)には加えて、protected、private、static を指定することが可能になります。
class クラス名 { 修飾子 class クラス名 { : } }
あるクラスのメンバ変数やメソッドを 継承 した サブクラス(子クラス)を定義するには extends を用います。
class クラス名 extends 親クラス名 { : }
下記の例では、上記で作成した Person クラスを継承する Member クラスを定義しています。Member クラスは Person クラスを継承しているので、myName、myAge などの属性や、GetName()、SetName() などのメソッドを引き継ぎ、加えて、myNumber や SetNumber() などの属性やメソッドを備えています。
class Member extends Person { int myNumber; public void SetNumber(int number) { myNumber = number; } public int GetNumber() { return myNumber; } }
super は、クラスの継承における 親クラス(スーパークラス)を示します。java では、親クラスのコンストラクタは暗黙的には呼ばれないため、下記のように明示的に呼び出してやる必要があります。
class Member extends Person { Member() { super("tanaka"); // 親クラスのコンストラクタを呼び出す super.SetAge(26); // 親クラスのメソッドを呼び出す return super.myName; // 親クラスの属性を参照する } }
instanceof 演算子は、オブジェクト(インスタンス)が、指定したクラスまたはその上位のクラスに属しているかどうかを調べます。
MyButton b = new MyButton(); if (b instanceof Button) { System.out.println("属してる"); } else { System.out.println("属していない"); }