え~今回はchapter14 クラスの基本形 まとめ 後編 です。
コンストラクタのオーバーロード
例えばこんな感じです
public Dice(){
Val= 1; //目数は1にする
}
次のように書くと手間がかからないので便利かも?
Dice dice=new Dice(); //目数は1(コンストラクタで1が代入される)
ただ、稀に目数の初期値を指定しなければいけない時もあるので、前回作った引数のあるコンストラクタをやめるわけにはいかないのが現状ですwww
クラスはコンストラクタを2つもつことができます。
これを、 コンストラクタのオーバーロード といいます。
12章でメソッドのオーバーロードについて説明しましたが、コンストラクタも条件は同じで引数構成(引数の型、数、並び順)が違えばいくつでもコンストラクタを作っても大丈夫なのです。
POINT コンストラクタのオーバーロード
引数構成(引数の型、数、並び順)が違うコンストラクタを複数作成できる。
では、実際にコンストラクタのオーバーロードをやっていこうと思います。
起動する方のプログラムはこんな感じになります。
で、起動するとこんな感じになるはず・・・・・
次にデフォルトコンストラクタの説明から・・・
デフォルトコンストラクタ
プログラマがコンストラクタを作成してない場合にJavaコンパイラが自動的に作成するコンストラクタを デフォルトコンストラクタ といいます。
デフォルトコンストラクタは引数がなく難の処理もしないコンストラクタ。
次にデフォルトコンストラクタの規則について
POINT デフォルトコンストラクタの生成規制
1つでもコンストラクタを作ると・・・・・・・
デフォルトコンストラクタは自動作成されなくなる。
他のコンストラクタを利用するコンストラクタ
package exercise;
public class Dice {
int val;
String color;
public Dice (int val,String color) {
this.val = val;
this.color = color;
}
public Dice(String color) {
this(1,color);
}
public Dice() {
this(1,"白");
}
public void play() {
val=(int)(Math.random()*6)+1;// ここにコードを挿入
}
}
thisを使うことでこのように簡単にコンストラクタが書けるようになります。
一番引数の多いコンストラクタを呼び出し値の設定を簡単にしているのがポイント。
記述のミスをなくす意味でも、コンストラクタをオーバーロードするときはこの書き方を。
thisは1行目に
this()が結構出てきましたが、
this()は『コンストラクタ定義の1行目に書かなければならない』
という規則があり、次のような書き方はできません。
public Dice(){
System.out.println("コンストラクタ呼び出し");
this(1,"白");<===========1行目に書いてないのでコンパイルエラー
}
1.カプセル化
カプセル化とは、外部のクラスに公開するメンバと非公開にするメンバを分けて、
クラスの独立性を確保することです。
代表的なものが、データ隠蔽です。
フィールド変数を外部からアクセスできないようににして、フィールド変数の値を操作する必要がある場合に備えて、専用のメソッドを提供する。
これがデータ隠蔽です。
具体的には、フィールド変数にprivate修飾子を付けて、他のクラスからアクセス不可にする。
代わりに、フィールド変数の値を取り出したり、フィールド変数に値をセットするために、専用のメソッド(アクセサメソッド)を用意します。
アクセサメソッドには、データを取得するゲッターと、データをセットするセッターがある。
では、カプセル化したクラスを見てみます。
package exercise;
public class Dice {
private int val;
private String color;
public Dice (int val,String color) {
this.val = val;
this.color = color;
}
public Dice(String color) {
this(1,color);
}
public Dice() {
this(1,"白");
}
public void play() {
val=(int)(Math.random()*6)+1;// ここにコードを挿入
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val=val;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color=color;
}
}
プログラムは上の通りですが
下の図で説明しますwww
パソコンの場合は ctrlと+で拡大できますので見にくい人は拡大してご覧ください。
private修飾子によって他のクラスからはvalにアクセスできなくなりました。
private修飾子は、クラス内のメンバだけがアクセスできるようにする修飾子です。
下の青枠で囲ったところはアクセサメソッドです。
フィールド変数の値を取得するゲッターと値を設定するセッターがありました。
外部のクラスが値を取得したりセットするときに使います。
よって次のような文ではアクセスができません。
System.out.println(dice.val);
privateメンバにアクセスできないことを不可視といい、
存在しているが見えないので使えないという意味です。
エラーメッセージなどでよく使われます。
POINT① thisはメソッドでも使える
thisはコンストラクタとインスタンスメソッドでも使えます。
★ゲッター、セッターともにアクセス修飾子としてpublicを付けなければいけません。
publicは条件を付けず、自由にアクセスできるという意味のアクセス修飾子です。
まとめると次の通りです。
POINT② データ隠ぺいによるカプセル化の手法
①フィールド変数にprivate修飾子を付けて、外部からは利用できなくする。
②public修飾子を付けたアクセサメソッド(セッターとゲッター)を作成する。
アクセス修飾子
privateが出てきたのでアクセス修飾子について。
アクセス修飾子はそれを付けた対象にアクセスできる条件を規定する。
主なアクセス修飾子
★private
同一クラス内に定義されたメソッドやコンストラクタからだけアクセスできる。
★デフォルトアクセス(修飾子なし)
同一クラス内に定義されたメソッドやコンストラクタからだけアクセスできる&他のクラスでもソースコードが同じパッケージ内にあれば、そのメソッドやコンストラクタからアクセスできる。
★public
条件なし自由にアクセスできる。
デフォルトアクセス
デフォルトアクセスにすると、ソースコードが同じパッケージ内にある暮らすメソッドやコンストラクタからもアクセスできる。
今回最後にアクセス修飾子による制限の図を説明してchaputer14を終わりにしようと思います。
アクセス修飾子による制限
上の図はアクセスの制限を図で示したもので、
private→デフォルト→publicの順番でアクセス制限が緩くなることが分かります。
ここまでご覧いただきありがとうございました。
BY マんタ
参考書は__________________________________
川場 隆 Kawaba Takashi
秀和システム