Javaはオブジェクト指向言語で、コードは クラス (class) の中に記述する。
何らかの意味ある特定データ群とそれらに関する処理をまとめたもの。オブジェクトの設計図とも言うべきもので、オブジェクト指向プログラミングの中心的役割を果たす。
(例)
人の名前、年齢、住所、Eメールアドレスを扱うクラス Person
public class Person {
private String name;
private short age;
private String address;
private String email;
public String getName() { return name; }
public short getAge() { return age; }
public String getAddress() { return address; }
public String getEmail() { return email; }
public void setName( String name ) { this.name = name; }
public void setAge( short age ) { this.age = age; }
public void setAddress( String address ) { this.address = address; }
public void setEmail( String email ) { this.email = email; }
private static short minAge = 0;
private static short maxAge = 200;
public static short getMinAge() { return minAge; }
public static short getMaxAge() { return maxAge; }
}
publicなクラスの場合、ソースファイル名は「クラス名.java」でなければならない。
従って、上のソースファイル名は Person.java でなければならない。
private, public, static については後述。
クラスの1個の実体。オブジェクト。
new で生成される。
(例)
Person p = new Person();
上の例の Person クラスのインスタンス p を生成。
java.util.Date d = new java.util.Date();
クラス java.util.Date (日付を扱うオブジェクト) のインスタンス d を生成。
クラスのインスタンス作成時に自動的に呼び出される特別なメソッド。クラス名と同じ名前になる。
戻り値はないので、定義の際には戻り値の型を指定しない。
パラメータなしのコンストラクタやパラメータを持つコンストラクタがある。
(例)
Person p = new Person();
上の例のPersonクラスのインスタンス p を生成。Person() なのでパラメータなしのコンストラクタが呼び出される。 上の Person クラスのようにコンストラクタが記述されていないクラスの場合は、デフォルトコンストラクタ (何もしない) が呼び出される。
クラス内にパラメータを持つコンストラクタを記述するとデフォルトコンストラクタは生成されなくなるので注意が必要である。
インスタンスが作成されるときは以下の順序で行われる。
クラスの中で処理を担当する関数。
クラスのインスタンスに結びついており、インスタンスから呼び出される。
クラスの内部では
メソッド()
の形で呼び出せるが、クラスの外からは
インスタンス.メソッド()
の形で呼び出す。
(例)
クラスの例のPersonクラスの中の、getName(), setName(), getAge(), setAge() など。
Person p = new Person(); p.setName( "山田太郎" ); p.setAge( 18 );
クラスの中で定義されており、クラスのインスタンスと結びついている変数。インスタンス一個一個に対して別個に存在する。
クラスの内部では、単に
変数名
の形で指定できるが、クラスの外からは
インスタンス.変数名
の形で指定する。
(例)
クラスの例の Person クラスの中の、name, age, address, email。
ただしこれらはprivateなのでクラスの外部からは直接はアクセスできない。
コンストラクタおよびインスタンスメソッドの中では、そのインスタンスを指す this が使用できる。
上記例のクラス Person で、
public void setName( String name ) { this.name = name; }
にあるように、インスタンス変数と同じ名前のパラメータあるいはローカル変数があっても、「this.」をつけることで、インスタンス変数を指定できる。このコードでは this.name がインスタンス変数、ただの name がパラメータを表す。
もう一つ別の this の使い方として、コンストラクタの本体の最初で、
this();
あるいは
this( パラメータ );
という形式で、同じクラスの別のコンストラクタを呼び出すことができる。
(例)
クラス Person で、以下のような2つのコンストラクタを定義し、一つがもう一つを呼び出すことができる。
// パラメータつきのコンストラクタ
public Person(String name, short age, String address, String email) {
this.name = name;
this.age = age;
this.address = address;
this.email = email;
}
// デフォルトコンストラクタ
// 上のパラメータつきのコンストラクタを呼び出す
public Person() {
this("UNKNOWN", 0, "UNKNOWN", "UNKNOWN");
}
クラスのインスタンスとは別個に存在し、独立して呼び出すことができるメソッド。
メソッドの型に static をつけて指定する。
staticメソッド中ではクラスのstaticフィールド (変数)・メソッドにはアクセスできるが、インスタンスと結びついていないので、インスタンス変数・メソッドにはアクセスできない。
クラスの内部では
メソッド()
の形で呼び出せるが、クラスの外からは
クラス名.メソッド()
の形で呼び出す。
(例)
クラスの例のPersonクラスの中の、getMinAge(), getMaxAge()
ひとつのクラスにおいてたった一つ存在する変数。
クラスのインスタンスとは独立して存在する。
変数の型名に static をつけて指定する。
クラスの内部では、単に
変数名
の形で指定できるが、クラスの外からは
クラス名.変数名
の形で指定する。
(例)
java.lang.Math.PI
java.lang.Math がクラスの完全修飾名。PI が static変数名。この場合は円周率 π を表す定数。
パッケージ java.lang の中のクラスは宣言がなくても単純名で使用できるので、他に Math と言う名前のクラスを使っていなければ、短く
Math.PI
としてよい。
※ static import の利用
Java 5 以降では、static import を使えば、さらに簡潔に記述できる。
上の例の場合、ソース上部の import 宣言部分に
import static java.lang.Math.PI;
を追加すれば、単に
PI
だけで、 java.lang.Math.PI を指定できる。
java.awt.Color.GREEN
java.awt.Color がクラスの完全修飾名。GREEN が staticフィールドで、緑色を表す定数。
クラスの上記例のPersonクラスの中の minAge, maxAge はshort型のstaticフィールドである。
ただしこれらはprivateなのでクラスの外部からは直接はアクセスできない。
Javaではクラス・メソッド・フィールドへのアクセスを制御することができる。アクセス制御には以下の4レベルがある。
クラス、メソッド、フィールドを外部の一般のクラスに対して公開する。
メソッド、フィールドを同一パッケージおよびサブクラスに対して公開する。
※ サブクラスにおける protedted のアクセスは非常に複雑。
staticフィールド/メソッドについては、単純にサブクラスに対して公開という解釈でよい。インスタンスフィールド/メソッドについては、サブクラス内で、同じサブクラスのインスタンス (暗黙あるいは明示した this も可) を介してのみ、protedted フィールド/メソッドにアクセスできる。
クラス、メソッド、フィールドを同一パッケージ内に対してのみ公開する。
言語仕様では デフォルトアクセス (default access) という用語が使われるが、内容を素直に表現した package private という説明的な言い方をされることもある。
クラス、メソッド、フィールドが外部のクラスからアクセスできないようにする。
変数が値を変更されないようにする。staticが共に指定されている場合、定数として扱う。
メソッドがオーバーライドされないようにする。
クラスが継承(サブクラス化)されないようにする。
(例)
public static final int NUMBER_OF_PERSON = 80;
int型の定数 NUMBER_OF_PERSON (= 80) を宣言する。publicなので、他のクラスからも参照できる。