2017-04-18 3 views
2

サブクラスオブジェクトがスーパークラスコンストラクタを保持できない理由は何ですか?なぜcantサブクラスオブジェクトがスーパークラスコンストラクタを保持するのですか

class Alpha 
{ 
    String getType1() 
    { 
     return "alpha"; 
    } 
} 

class Beta extends Alpha 
{ 
    String getType1() 
    { 
     return "beta"; 
    } 
    String acc() 
    { 
     return "acc"; 
    } 
} 

public static void main(String[] args) 
{ 
    Alpha a1=new Beta(); 
    System.out.println(a1.getType1()); 
} 

出力は「ベータ」です。オブジェクトa1はacc()への可視性を持っていませんか?ここで驚くべき

答えて

3

何もありません:

System.out.println(a1.getType1()); 

あなたはスーパークラスで定義されているメソッドを呼び出しています。サブクラスでオーバーライドされます。サブクラスのインスタンスを作成します。実行されるメソッドはオーバーライドされたバージョンです。

ベータ版は、とにかく全くここに遊びに来ていないあなたの例で使用されているすべてのでないメソッドが含まれているという事実。そして、たとえgetType1()acc()を呼び出すとしても、それでも動作します。つまり、エッセンスpolymorphismです!

そして、ちょうど正確には:あなたは、クラスを持っているメソッドのどれconstructorではありません!

+0

junitの機能要件と非機能要件を理解してください。 –

+0

これはかなり広いテーマです。もう少し文脈を与えることができますか?詳細情報なしで言うべき唯一のこと:A)テストケースの機能要件...対応する生産コードを確認することです**。 B)非機能要件...私は、例えば "良い"単体テストを構成するそれらの "特性"を見るでしょう。 [ここ](http://artofunittesting.com/definition-of-a-unit-test/)のように概説されています。 – GhostCat

-1

これは、メソッドのオーバーロードの例です。オーバーロードされたメソッドへの実際の呼び出しは、実行時に解決されます。どのメソッドが呼び出されるかは、オブジェクトのタイプではなく、具体的なオブジェクトに依存します。ここでの参照はAlpha型ですが、オブジェクトはBeta型です。したがって、方法getType1()はここで正しい動作であるベータ版を出力します。

その他の注意事項:あなたは私はちょうど私たちがベータ版を(作成するときにことを知っておく必要があり、ここで答えを見つけて、それ民間

+2

質問を編集するよりも、特に編集*が答えを大きく変更したときに、回答を編集するのはあまり一般的ではありません。一般的なプラクティスは、著者に質問を修正するように要請するコメントを書くこと、または彼らが話していることとダウンボートしていることを知らないと仮定することです。 – RealSkeptic

0

することによって、それを制限する必要がある場合を除きまで、子供は常に親クラスのデフォルトコンストラクタへのアクセスを持っている)、内部それが故に、JVMは、複数の既存のクラスがあることを知って、そのすべてのスーパークラスのデフォルトコンストラクタを呼び出しますが、私は宣言と同じようinitialzeとき:JVM本家

Alpha a1=new Beta(); 

はベータクラスが存在しているが、あなたがあなたのアクセスを制限することを知っていますa1のタイプはAlphaクラスであると言って、あなたのサブクラスにアクセスすることはできませんメソッド。

関連する問題