-1

抽象クラス 親 { int i = 9;

void display() {
    System.out.println("base");
}

}

class Child extends Parent { int i = 8;

public void display() {

    System.out.println("derived");
}

}

公開クラスA {

public static void main(String args[]) {
    Parent a1 = new Child();
    a1.display(); // calls child class method
    System.out.println(a1.i);// calls parent class member

}

}

4

5 に答える 5

1

クラスメソッドのオブジェクトを作成せずに、Parentクラス メソッドに直接アクセスすることはできませんdisplay()。ただし、子クラスからアクセスできます。このように

 class Child extends Parent {
   int i = 8;
   public void display() {
      super.display();
      System.out.println("derived");
   }
 }

Java docs Accessing Superclass membersによると

メソッドがそのスーパークラスのメソッドの 1 つをオーバーライドする場合、キーワード super を使用してオーバーライドされたメソッドを呼び出すことができます。super を使用して隠しフィールドを参照することもできます (ただし、フィールドを隠すことは推奨されません)。

于 2013-08-13T06:08:42.467 に答える
1

このコードを実行すると、派生クラスの表示メソッドが呼び出されています

virtualサブクラス メソッドを使用するには、メソッドを as として指定する必要がある C++ や C# などの他のプログラミング言語でプログラミングしたようです。privateJava では、 、 、finalおよびを除くすべてのメソッドstaticが仮想です。

これを知っていると、クラスはすでにクラスからメソッドをChildオーバーライドしているため、これを行うと:displayParent

Parent a1 = new Child();
a1.display();

a1.displaydisplayは、実際のオブジェクト参照クラス (この場合は )のメソッドを実行しますChild#display

コードを修正するa1には、 の初期化をnew に変更しParentます。

Parent a1 = new Parent();
a1.display();

より詳しい情報:


編集後a1、コンソールで印刷するときに問題に直面するようになりまし9た。おそらく8. ここで行っているのは、フィールドを非表示にすることです。フィールドはオーバーライドされないため、変数の値は、i変数に対して宣言された実際のクラス タイプによって異なります。a1として宣言したのでParenta1.iは の値を取りますParent#i

このコードを修正するa1には、変数の型をChild次のように変更します。

Child a1 = new Child();
System.out.println(a1.i);
a1.display();

または、さらに良い解決策:フィールドをオーバーライドしようとないでください。さらに悪いことに、他のクラスからクラス フィールドに直接アクセスしようとせず、代わりにそれぞれのgettersetterを使用してください。

より詳しい情報:


中間の親クラスがそれをオーバーライドするときに祖先クラスのメソッドにアクセスする方法は?

これがあなたの本当の質問だとすれば、答えは簡単です。できません。

于 2013-08-13T06:09:02.717 に答える
0

あなたの質問を正しく理解している場合は、CHILD インスタンスを使用して PARENTS 表示メソッドを呼び出そうとしています。

派生クラス オブジェクトだけでは、基本クラス バージョンへの非仮想呼び出しを行うようにコンパイラに指示する方法はありません

于 2013-08-13T06:09:41.340 に答える
0

あなたが尋ねようとしているのは、親クラスの変数が表示される理由と子クラスのメソッドだと思います。

まず、オーバーライドは変数には適用されず、メソッドに適用されます。参照が属するクラスに関係なく、その変数はすぐに表示されます。コードでは、

    Parent a1 = new Child();  
    System.out.println(a1.i);

ここで a1 は Parent クラスへの参照なので、Parent クラスの変数が表示されます。

メソッドの場合、どのバージョンのメソッドが呼び出されるかは実行時に決定されます。そのメソッドが呼び出され、オブジェクトが作成されます。ここでは、 Child クラスのオブジェクトが cratedParent a1 =new Child();です。new Child()の部分、したがって Child クラス メソッドを参照してください。ただし、このメソッドは、参照が属するクラスに存在する必要があることに注意してください。例えば

   Class Parent
    {
    }

   Class Child extends Parent
    { 
      public void display() 
        {
          System.out.println("derived");
        }
      public static void main (String []args)
        {
         Parent a1 = new Child();
         a1.display();    //Error  
        }  
      }

元の例で基本クラスのメソッドを呼び出すには、他の人が言及したように super を使用します。または、単に親クラスのオブジェクトを作成します

Parent o = new Parent();
o.display();              //prints base
于 2013-08-13T06:40:12.300 に答える
0

あなたはできません。親クラスのコードを実行する場合は、親クラスを作成するか (注:Parent抽象クラスではありません) super.someMethod()、子のメソッドの 1 つに呼び出しを提供する必要があります。例えば:

public void display() {
        super.display();
        System.out.println("derived");
    }
于 2013-08-13T06:13:02.827 に答える