Revised: Dec./27th/2001: Since: Dec./26th/2001
前節までで、クラスをインスタンス化して利用する例を見ました。今まで作ってきたモノを見直してみます。
Hello.java:
class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
main() メソッドを持ったクラスはファイル名と同じでなければなりません。このファイル名は Hello.java であり、クラス名は Hello です。大文字と小文字の区別も含めて同じでなければなりません。
全体の構造から見ます:
Hello で、修飾子は省略されている。main() で、修飾子は public, static。いま我々は、クラスの構成要素、既存クラスのインスタンス化について知っています。そこで、新しいクラスを作って、 main() メソッドから利用してみましょう。
Hello.java:
class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java");
}
}
class Bye {
//メンバ変数
String sayonara;
//メソッド
void setSayonara(String bye) { //戻り値なし。
sayonara=bye; //このメソッドの引数がメンバ変数にセットされる。
}
}
このファイルには Hello クラスと Bye クラスが用意されています。アプリケーションが実行されたときに自動的に実行されるのは main() メソッドであり、このメソッドを持つクラスはファイル名と同じでなければならない。
それ以外のクラス名は自由につけて構わないが、最初の文字は半角英大文字でなければならない。最初の文字に数字は許されない。今の場合は、 Bye と名付けた。
Bye クラスはメンバ変数 sayonara と、メソッド setSayonara を持っている。 setSayonara は、引数の文字列をメンバ変数にセットしている。
このクラスを main() メソッドでインスタンス化して、メソッドとメンバ変数を利用してみよう。
class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java");
//インスタンス化
Bye sato=new Bye();
Bye suzuki=new Bye();
//一つのクラスから二つのインスタンスを作っている。
//メソッド呼び出し
sato.setSayonara("さようなら");
suzuki.setSayonara("バイバイ");
//メンバ変数へのアクセス
System.out.print("sato: ");
System.out.println(sato.sayonara);
System.out.print("suzuki: ");
System.out.println(suzuki.sayonara);
}
}
class Bye {
//メンバ変数
String sayonara;
//メソッド
void setSayonara(String bye) { //戻り値なし。
sayonara=bye; //このメソッドの引数がメンバ変数にセットされる。
}
}
これで新しく作ったクラスのメソッドが利用できているはずです。
C:\Java>javac Hello.java C:\Java>java Hello Hello, Java sato: さようなら suzuki: バイバイ
javac によるコンパイル時に、二つのクラスファイル Hello.class, Bye.class が作られていることを確認してください。一度コンパイルしておけば、他のメソッドからもアクセスできます。このアクセス制限を記述するのが修飾子です。
この例の場合は、メンバ変数 sayonara に修飾子がついていないので、直接メンバ変数自身を参照できました。
修飾子をつけて、メンバ変数にアクセス制限を掛けてみましょう。同じクラスからしかアクセスできなくするのは private 修飾子です。この修飾子をメンバ変数 sayonara の定義に付けてみましょう。
//メンバ変数 private String sayonara;
このままコンパイルすると次のようになります:
C:\Java>javac Hello.java
Hello.java:16: sayonara は Bye で private アクセスされます。
System.out.println(sato.sayonara);
^
Hello.java:18: sayonara は Bye で private アクセスされます。
System.out.println(suzuki.sayonara);
^
エラー 2 個
違うクラスから private 宣言されたメンバ変数にアクセスしようとしているので、コンパイルエラーになるのです。
メンバ変数に直接アクセスしないで、メソッドを経由してみましょう。 Bye クラスに次にのメソッドを追加してください:
String getSayonara() { //修飾子は省略、戻り値は String 型
return sayonara; //メンバ変数を戻り値にして制御を戻す
}
一方、 main() メソッドの16行目と18行目も、メンバ変数への直接アクセスではなく、メソッドの呼び出しに修正します:
System.out.print("sato: ");
System.out.println(sato.getSayonara());
System.out.print("suzuki: ");
System.out.println(suzuki.getSayonara());
ファイル Hello.java の全体は次のようになったはずです:
class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java");
//インスタンス化
Bye sato=new Bye();
Bye suzuki=new Bye();
//メソッド呼び出し
sato.setSayonara("さようなら");
suzuki.setSayonara("バイバイ");
//メソッド呼び出し
System.out.print("sato: ");
System.out.println(sato.getSayonara());
System.out.print("suzuki: ");
System.out.println(suzuki.getSayonara());
}
}
class Bye {
//private 宣言されたメンバ変数
private String sayonara;
//メソッド
void setSayonara(String bye) { //戻り値なし。
sayonara=bye; //このメソッドの引数がメンバ変数にセットされる。
}
//メソッド
String getSayonara() { //戻り値は String 型
return sayonara; //メンバ変数を戻り値にして制御を戻す
}
}
これで private 宣言されたメンバ変数 sayonara を、メソッド getSayonara() を介して利用できるはずです。
C:\Java>javac Hello.java C:\Java>java Hello Hello, Java sato: さようなら suzuki: バイバイ
ここでは簡単なクラスの作成、とインスタンス化、別のクラスのメンバ変数、メソッドの利用について紹介しました。