Javaピックアップ---親を継承するメンバー変数とメソッドの違い
1099 ワード
一、親を継承するメンバー変数と親を継承する方法の違いはありますか?
1、ソースコードの例:
出力結果:
2
20
2、原因分析:
コードを少し真剣に分析したばかりであれば、予想出力と実際の出力が異なることに気づくかもしれません.「違うよ、
bdはサブクラスDerivedのオブジェクトを指しているのではないでしょうか.結果は20ではないでしょうか.」
実はあなたが考えている理由はこうです.
まず、宣言時タイプ、実行時タイプの2つの概念を知る必要があります.前者は参照変数を宣言するときに使用されるタイプで、後者は
実際に実行中のタイプ.抽象的かもしれません.簡単に言えばBasebd=new Derived(); Baseはbdの宣言時タイプ、Derived
bdのランタイムタイプです.
実際:
単純で重要な結論は、子クラスが親クラスのメソッドを書き換えると、親クラスで書き換えられたメソッドが上書きされ、子クラスを指すということです.
オブジェクトの参照呼び出しこれらの親子クラスには、宣言時のタイプが親であっても、それ自体であっても、サブクラスで書き換えられたメソッドが呼び出されます.
これをカバーと言います.親クラスのメンバー変数は、クラス内の同名のメンバー変数によって上書きされません.これらの同名のインスタンス変数が参照変数によってアクセスされると、
戻り値は、参照される宣言のタイプによって異なります.
1、ソースコードの例:
class Base {
int count = 2;
public void display() {
System.out.println(this.count);
}
}
public class Derived extends Base {
int count = 20;
@Override
public void display() {
System.out.println(this.count);
}
public static void main(String[] args) {
//
Base bd = new Derived(); // 1
System.out.println(bd.count);
bd.display();
}
}
出力結果:
2
20
2、原因分析:
コードを少し真剣に分析したばかりであれば、予想出力と実際の出力が異なることに気づくかもしれません.「違うよ、
bdはサブクラスDerivedのオブジェクトを指しているのではないでしょうか.結果は20ではないでしょうか.」
実はあなたが考えている理由はこうです.
まず、宣言時タイプ、実行時タイプの2つの概念を知る必要があります.前者は参照変数を宣言するときに使用されるタイプで、後者は
実際に実行中のタイプ.抽象的かもしれません.簡単に言えばBasebd=new Derived(); Baseはbdの宣言時タイプ、Derived
bdのランタイムタイプです.
実際:
単純で重要な結論は、子クラスが親クラスのメソッドを書き換えると、親クラスで書き換えられたメソッドが上書きされ、子クラスを指すということです.
オブジェクトの参照呼び出しこれらの親子クラスには、宣言時のタイプが親であっても、それ自体であっても、サブクラスで書き換えられたメソッドが呼び出されます.
これをカバーと言います.親クラスのメンバー変数は、クラス内の同名のメンバー変数によって上書きされません.これらの同名のインスタンス変数が参照変数によってアクセスされると、
戻り値は、参照される宣言のタイプによって異なります.