Fieds_labo3
基本-継承
最終更新:
fieds_labo3
-
view
基本 クラス継承
既存のクラス(スーパークラス)から新しいクラス(サブクラス)を作成
スーパークラス+α=サブクラス
スーパークラス+α=サブクラス
1.サブクラスの宣言
スーパークラスを拡張してサブクラスを宣言
サブクラスはスーパークラスのメンバを継承
class サブクラス名 extends スーパークラス名
{
スーパークラスを拡張してサブクラスを宣言
サブクラスはスーパークラスのメンバを継承
class サブクラス名 extends スーパークラス名
{
サブクラス追加フィールド サブクラスコンストラクタ サブクラス追加メソッド
}
2.スーパークラスのコンストラクタ(初期化指定)
- 未指定の場合
サブクラスのオブジェクトが作成されたとき、サブクラスのコンストラクタ内の先頭で、スーパークラスの引数のないコンストラクタをコール。
- super() で指定
サブクラスのコンストラクタの先頭で super(a, b); のように記述するとスーパークラスの引数のあるコンストラクタをコール。
this()とsuper()はどちらもコンストラクタの先頭行に記述となるため、排他記述。
3.protected、super.
- スーパークラスのprivateメンバには、サブクラスからアクセス不可
- スーパークラスのprotectedメンバには、サブクラスからアクセス可
- サブクラス内で super.スーパークラスのメソッド とするとスーパークラスのメソッドをコール
- サブクラスからスーパークラスの同じ名前のメンバにアクセスする場合は、super.を付ける。
- 関連:クラス内でインスタンス変数とローカル変数が重複する場合、this. をつけるとインスタンス変数、つけないとローカル変数。
4.メソッドのオーバーライド
サブクラスでスーパークラスのメソッドをオーバーライド可
オーバーロードとの違いに注意。
サブクラスでスーパークラスのメソッドをオーバーライド可
オーバーロードとの違いに注意。
5.スーパークラス変数とサブクラスオブジェクト
こんな記述もできるのは良いけど、自分の中ではどっちかに統一して書いた方がいいよねぇ。
こんな記述もできるのは良いけど、自分の中ではどっちかに統一して書いた方がいいよねぇ。
- サブクラス変数でオブジェクト
SubAbc subabc1;
subabc1 = new SubAbc();
subabc1 = new SubAbc();
- スーパークラス変数でオブジェクト
Abc abc1;
abc1 = new SubAbc();
オブジェクトをさす変数のクラスに関係なく、適切なメソッドをコール。
abc1 = new SubAbc();
オブジェクトをさす変数のクラスに関係なく、適切なメソッドをコール。
同様にスーパークラスの配列変数に対して、スーパークラスとサブクラスのオブジェクトを作成可。
6.final
- メソッドに指定した場合、サブクラスでオーバーライド不可
- フィールドに指定した場合、値変更不可。この場合、フィールドは必ず初期化すること。定数となる。
- クラスに指定した場合、サブクラス拡張不可
8.Objectクラス
スーパークラスを指定しないクラスは、Objectクラスのサブクラスになる。
すなわち、すべてのクラスはObjectクラスを継承。
スーパークラスを指定しないクラスは、Objectクラスのサブクラスになる。
すなわち、すべてのクラスはObjectクラスを継承。
9.Objectクラスの主なメソッド
- boolean equals(Object obj) :オブジェクトが引数と同じか判断
- Class getClass() :オブジェクトのクラスを返す
- String toString() :オブジェクトのあらわす文字列を返す