oracleJavaSilverの勉強日記(継承の操作)
継承
あるクラスを機能拡張した新しいクラスを定義すること。拡張元になるクラスのことをスーパークラス。拡張したクラスのことをサブクラスと呼ぶ。
継承をすることで、サブクラスはスーパークラスの特徴を引き継ぐ。サブクラスのインスタンスは、スーパークラスのインスタンスと差分のインスタンスの両方で構成されている。
継承するにはextendsを使う。
下の二つはサブクラスに引き継がない
・コンストラクタ
・privateなフィールドやメソッド
デフォルトは「パッケージアクセス」と呼ばれ、同じパッケージに属するクラスのインスタンスからのアクセスを許可するものです。たとえ継承関係にあっても、スーパークラスとサブクラスのそれぞれが属するパッケージが異なれば、アクセスできない。
protectedは異なるパッケージであっても継承関係にあればアクセスできる。
※多重継承をすることはできない。
インターフェース
特徴
・メソッドはpublicしか持てない。省略しても自動的にpublicになる。
・多重実現をすることができる。その場合はカンマ区切りで列挙する。
・抽象メソッドしか書くことしかできない。
・フィールドは二つのルールを満たせばつかえる。
finalを使って、定数にする。
staticと使って、インスタンスが生成できなくても使える。
インターフェースを実現するにはimplementsを使う。
抽象クラス
インターフェースとクラスの両方の性質を持ったクラス。つまり、実装を持つ具象メソッドと実装を持たない抽象メソッドの両方を持つことができる。また、フィールドも定義できる。
抽象クラスはインターフェースと同じでインスタンス化できない。
オーバーライド
サブクラスでスーパークラスに定義されたメソッドを「再定義」すること。
オーバーライドをするにはいくつかのルールがある。
・メソッドのシグニチャ(メソッド名、引数リストの型、数、順番)が同じ。
・戻り値型が同じ型かサブクラス。
・アクセス修飾子が同じか、緩いもの。
サブクラスのインスタンスは、スーパークラスのインスタンスと差分のインスタンスで構成されている。そのため、同じ名前のフィールドがあった場合、2つのインスタンスには同名の異なるフィールドが存在することになる。こういう状態になったとき、どちらのフィールドが使われるかはルールが決まっている。
・フィールドを参照した場合には、変数の型で宣言された方を使う。
・メソッドを呼び出した場合には、メソッド内の指示に従う。
型変換
継承関係にある場合、サブクラスのインスタンスをスーパークラス型の変数で扱うことができる。このように、サブクラスをスーパークラス型に変換することを「アップキャスト」と呼ぶ。スーパークラス型で扱っていたインスタンスを、元の型に戻すことを「ダウンキャスト」と呼ぶ。
アップキャストはコンパイラが自動的に型変換(キャスト)してくれる。
ダウンキャストは明示的にキャスト式を書かなければいけない。キャスト式は、変換したい型をカッコ「()」内に記述する。
※型同士に互換性がない場合は、実行時に例外がスローされる。
スコープ
同じスコープ(有効範囲)内に同じ名前の変数を宣言することはできない。ただし、フィールド変数とローカル変数を同じ名前にすることはできる。なぜなら、「this.フィールド名」を使ってフィールド変数を呼び出すから。
フィールド変数とローカル変数を同じ名前で宣言した場合、ローカル変数が優先される
super();
サブクラスのインスタンスを作る時、スーパークラスのインスタンスを持つコンストラクタと、差分のインスタンスがもつコンストラクタがあった場合、先に実行しなければいけないのは、スーパークラスのインスタンスが持つコンストラクタ。
サブクラスのコンストラクタには、スーパークラスのコンストラクタを呼び出す「super();」がコンパイラによて先頭行に追加される。