1

このクラスがあるとします:

class B extends A
{
  @Override 
  void foo () { ... }
}

クラス B のオブジェクトが与えられた場合、クラス A から明示的に foo メソッドを呼び出すことができますか? オブジェクトをダウンキャストしてみました。つまり、

B b = new B();
((A)b).foo();

しかし、それはうまくいかないようです。

Javaでやりたいことを達成する方法はありますか?

4

4 に答える 4

1

Java では、デフォルトですべての関数/メソッドが仮想です。したがって、継承のシナリオでは、サブタイプのメソッド呼び出しは、参照タイプがスーパータイプ/サブタイプであるかどうかに関係なく、常にサブタイプのそのメソッドのバージョンを呼び出します。

A a = new B();
a.foo();

B b = new B();
b.foo()

foo()both はin Bonlyのバージョンを呼び出します。

関数を明示的に仮想宣言する必要がある C++ から来た人で、この種の動作がポインターでのみ観察される場合、Java での同じ動作を別の方法で理解する必要があります。

于 2012-10-21T03:57:26.067 に答える
0

こんな感じです.....

-呼び出されるforの最も具体的なバージョンmethodclass

例えば:

public class A{

  public void go(){

      System.out.println("A");

    }

 }


class B extends A{

  public static void main(String[] args){
     B b = new B();
     b.go();
   }

  }

上記class Bでは、メソッドgo()Not overriddenであるため、メソッド fromclass Aが呼び出されます。

以下のような場合、class Bメソッドgo()が呼び出されます。

クラス B は A を拡張します {

  public void go(){

      System.out.println("B");

    }

   public static void main(String[] args){
     B b = new B();
     b.go();
   }

}

上記のクラス " The Most specific version of go() method is called"で

于 2012-10-21T04:32:48.917 に答える