私は、次のコードを持っています:
package testapp;
class Calculation {
public Calculation(){}
public void addition(int x, int y) { }
public void Subtraction(int x, int y) { }
}
class My_Calculation extends Calculation {
public My_Calculation(){}
public void multiplication(int x, int y) { }
}
public class TestApp {
public static void main(String[] args) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
System.out.println(demo.getClass().getName());
Calculation d = new Calculation();
d.Subtraction(b, b);
d.addition(b, b);
// no multiplication
System.out.println(d.getClass().getName());
Calculation d2 = new My_Calculation();
d2.Subtraction(b, b);
d2.addition(b, b);
// no multiplication
System.out.println(d2.getClass().getName());
}
}
出力は以下です:
デモ= testapp.My_Calculation
D = testapp.Calculation
D2 = testapp.My_Calculation
次の文は、宣言参照変数名のことであるD2オブジェクト型への計算:
Calculation d2;
次の文は、My_Calculationのコンストラクタを呼び出し初期化です。
Calculation d2 = new My_Calculation();
私は、次のコードを実行すると、出力はその述べd2はクラス型であるMy_Calculationが、内のメソッドにアクセスすることができます計算クラスを。
System.out.println(d2.getClass().getName());
出力:testapp.My_Calculation
アクセス:付加; 引き算
さて、私の理解ではMy_Calculationコンストラクタが呼び出された場合、私はどちらか持っているべきであると私に語りました:
1.乗算のみへのアクセス、または
加算、減算、乗算2.アクセス。
:しかし、私は実際には逆の取得加算と減算のみへのアクセスを。したがって、私は直感に反するとしてこれを参照してください。
誰かが私の理由は、オブジェクトのコヒーレント理解与えるために、ここで何が起こっているのか私には説明できMy_Calculationは:タイプのへのアクセスまったく持っていないだろう独自のメソッドが、へのアクセスのみスーパークラスのメソッドを。
ここに:
Calculation d2 = new My_Calculation();
あなたはタイプのオブジェクトを作成My_Calculation
しますが、スーパータイプで宣言された変数に代入します!そして、コンパイラは、「見る」ためのスマート十分ではありませんd2
、実際に子タイプのです。したがって、コンパイラ、その子のタイプに定義されたメソッドを呼び出すことから防止できます。コンパイラに、そのためd2
であることが知られていますCalculation
!
あなたができることに注意してくださいキャストコンパイラ「私がよく知っている」を伝えるために:
( (My_Calculation) d2) ).multiplication(...
ことはしても、実行時に、コンパイル時に働くだろう!
あなたの誤解はここから:
Calculation d2 = new My_Calculation();
あなたが上で行う右側割り当てのは、基本的に次の行に「忘れられた」です。そして、コンパイラは、唯一のあなたには、いくつか持っていることを知っているd2
タイプのをCalculation
!
最後に:はい、あなたの中に具体的な例として、コンパイラは簡単に決定することができる本当の種類をd2
。しかし、それは容易な、あるいは不可能ではない多くの状況があります。したがって、Javaの背後にある人々は、このような潜在的な「知識」を無視することにしました。