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()in的版本B

如果您是来自 C++ 的人,其中函数必须显式声明为虚拟,并且这种行为只能通过指针观察到,那么在 java 中相同的行为需要以不同的方式理解。

于 2012-10-21T03:57:26.067 回答
1

object由于多态性,总是方法调用将在类型上。

在这种情况下,即使您进行了强制转换, object 也是 type B,因此将调用foo()方法 from 。Class B

这个太阳教程可以帮助你。

于 2012-10-21T03:52:49.343 回答
0

就像这样.....

-具体method版本class被称为。

例如:

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()没有被覆盖,所以方法 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 回答
0
B b = new B();
((A)b).foo();

在第二行中,您正在使用对象“b”的引用。因此,您在其引用上调用的任何方法都将调用foo()对象“b”的重写方法。从对象引用的角度思考将帮助您清楚地理解 Java 的 OOPS 概念。

于 2012-10-21T04:02:00.337 回答