第7日目:アクセス指定子
アクセス指定子
アクセス指定子とは
第6日目では、クラスのフィールドやメソッドに対して外部から自由にアクセスしていました。しかし、実際のプログラム開発では、クラスの内部のデータや処理を外部から勝手に変更されないよう、アクセスを制限したい場合があります。
Javaでは、フィールドやメソッドの先頭にアクセス指定子をつけることで、そのメンバへのアクセス範囲を制御することができます。Javaで使用できる主なアクセス指定子は以下の表7-1のとおりです。
| アクセス指定子 | 呼び名 | 意味 |
|---|---|---|
| public | パブリック | どこからでも呼び出せる |
| (なし) | デフォルト | 同じパッケージ内からしか呼び出せない |
| protected | プロテクティッド | 同じパッケージか、そのサブクラスからしか呼び出せない |
| private | プライベート | 同じクラス内からしか呼び出せない |
コンストラクタ
コンストラクタとは
コンストラクタとは、インスタンスを生成したときに自動的に呼び出される特殊なメソッドです。コンストラクタの名前はクラス名と同じで、戻り値の型は記述しません。コンストラクタには引数を持たせることもでき、インスタンス生成時に初期値を設定するために使用されます。
処理
}
サンプルプログラム
以下のサンプルでは、SampleClass02にコンストラクタとアクセス指定子を定義し、Sample701から利用しています。
package day7;
public class SampleClass02 {
public SampleClass02(){
System.out.println("コンストラクタ");
}
private void method1(){
System.out.println("method1(private)");
}
public void method2(){
System.out.println("method2(public)");
}
public void method3(){
method1();
System.out.println("method3(public) : num=" + this.num);
}
private int num = 1;
}
package day7;
public class Sample701 {
public static void main(String[] args) {
SampleClass02 s = new SampleClass02();
s.method2();
s.method3();
}
}
method2(public)
method1(private)
method3(public) : num=1
インスタンスを生成した際に、コンストラクタが自動的に呼び出され「コンストラクタ」が表示されます。method1()はprivateのため、Sample701から直接呼び出すことはできませんが、同じクラス内のmethod3()からは呼び出すことができます。
カプセル化
カプセル化とは
フィールドをprivateにして外部から直接アクセスできないようにし、専用のメソッドを通じてのみアクセスできるようにする設計手法をカプセル化と言います。カプセル化はJavaプログラミングの標準的な設計手法であり、データを保護し、クラス内部の実装を変更しやすくするという利点があります。
セッター・ゲッター
セッターとゲッターとは
privateなフィールドへのアクセスを提供するために使用されるメソッドがセッター(setter)とゲッター(getter)です。セッターはフィールドに値を書き込むメソッド、ゲッターはフィールドの値を読み出すメソッドです。
- セッター:
set+ フィールド名の先頭を大文字にしたもの(例:setNumber) - ゲッター:
get+ フィールド名の先頭を大文字にしたもの(例:getNumber)
| フィールド名 | セッター | ゲッター |
|---|---|---|
| number | void setNumber(int number) | int getNumber() |
| str | — | String getStr() |
図7-1:セッターとゲッター
サンプルプログラム
以下のサンプルでは、SampleClass03にprivateフィールドとコンストラクタ、セッター・ゲッターを定義し、Sample702から利用しています。
package day7;
public class SampleClass03 {
private int number = 0;
private String str = "";
public SampleClass03(String str){
this.str = str;
}
public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return this.number;
}
public String getStr(){
return this.str;
}
}
package day7;
public class Sample702 {
public static void main(String[] args) {
SampleClass03 s = new SampleClass03("HelloWorld.");
s.setNumber(100);
System.out.println(s.getNumber());
System.out.println(s.getStr());
}
}
HelloWorld.
SampleClass03のフィールドnumberとstrはprivateのため、外部から直接アクセスすることができません。コンストラクタでstrの初期値を設定し、setNumber()でnumberに値を代入し、getNumber()とgetStr()でそれぞれの値を取得しています。
デフォルトコンストラクタ
デフォルトコンストラクタとは
第6日目のSampleClass01には、コンストラクタが定義されていませんでした。しかし、Sample601でインスタンスを生成することができました。これは、コンストラクタが定義されていない場合、Javaが自動的にデフォルトコンストラクタを用意するためです。
デフォルトコンストラクタは、何も処理を行わないコンストラクタで、プログラマには見えないところで自動的に定義されます。(図7-2)
図7-2:Javaのデフォルトコンストラクタ
ただし、引数ありのコンストラクタを明示的に定義した場合(SampleClass03のように)は、デフォルトコンストラクタは自動的には作られません。その場合、引数なしでインスタンスを生成しようとするとエラーになります。