2017-04-18 8 views
-1

ダイナミックメソッドバインディングスーパークラスリファレンスは、それによって継承され、オーバーロードされるサブクラスメソッドのみを呼び出すことができます。しかし、そうでなければ実装することができます。ここスーパークラスオブジェクトは、継承されていないサブクラスメンバメソッドを参照することは可能ですか?

abstract class in 
{ 
    abstract void print(); 
} 
class a extends in 
{ 
    String name=this.getClass().getSimpleName(); 
    void show() 
    { 
     System.out.println("class "+name); 
    } 
    void print() 
    { 
     show(); 
    } 
} 
class Main 
{ 
    public static void main(String args[]) 
    { 
     in x; 
     x = new a(); 
     x.print(); 
    } 
} 

、このがでスーパークラスのオブジェクトを指すとして代わりスーパー名のサブクラス名を返す正常

クラス

またのgetClass()を印刷します主な方法。

+3

親は子供について知ることができません。クラスの開発者は、そのクラスがユーザーによってどのように拡張されるかを知ることができません。 – duffymo

+0

すべての 'in'は、' print() 'と呼ばれるメソッドを持つべきであることを知っています。そのメソッドのすべての実装は 'a'の内部で行われています。これは' a'(すべてのクラス名と他のメソッドまで)を知っています。 – khelwood

+0

x.print()はnew a()と同等です。print()?しかし、xはスーパークラスのリファレンスではありませんか? – ZEU5

答えて

0

親オブジェクト参照は、クラス定義内にあるメソッドによって制約されます。それらのメソッドがサブクラスによってオーバーライドされ、実行時に、親参照によって参照される実際のオブジェクトがサブクラス型の場合、そのオーバーライドされたメソッドが呼び出されます。オーバーライドされたメソッドが元々親クラスに存在しないメソッドを呼び出すか、親クラスに存在しない変数にアクセスするかどうかは関係ありません。

これは、多型がすべてについてです。これは、親クラスが特定のメソッドの正確な実装を知る必要がなく、サブクラスによって実装されたものを何らかの契約のようにすることができる異なる特定の継承階層を持つ場合に、プログラムの拡張を容易にするので、 。

+0

これは唯一有益な答えでした。 :-) – ZEU5

0

今後は、今日クラスA.javaを書く開発者不明で、将来的に他の開発者がA.javaを拡張する彼のクラスに含まれるメソッドの名前や署名を予測することはできません。また、そのようなクラスは、それぞれが別個の方法を有する多数であってもよい。

基本クラスは、そのサブクラスと決して結合しないでください。サブクラスがどのように実装されているかは気にしてはいけません。

サブクラスの1つで定義されているメソッドを呼び出すことをお勧めしますが、のように、以下のようにを型キャストすることもできます。

public class Parent { 
    public class someMethod(){ 
      if(this instanceof Child1){ 
       ((Child1)this).someAdditionalMethod(); 
      } 
    } 
} 

public class Child1 extends Parent{ 
    public class someAdditionalMethod(){ 

    } 
} 
関連する問題