从对象引用访问超类方法(新手)

时间:2012-10-21 03:51:58

标签: java superclass dynamic-dispatch

假设我有这门课程:

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

现在如果给出B类对象,我可以从A类中显式调用foo方法吗? 我试图向下转换对象,即

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

但这似乎不起作用。

那么有没有办法在Java中完成我想做的事情?

4 个答案:

答案 0 :(得分:1)

由于多态性,始终方法调用将在object的类型上。

在这种情况下,即使您进行了强制转换,对象的类型为B,因此将调用foo()中的Class B方法。

sun tutorial可能会对您有所帮助。

答案 1 :(得分:1)

在Java中,默认情况下所有函数/方法都是虚拟的。因此,在继承场景中,对子类型的方法调用总是在子类型中调用该方法的版本,而不管引用类型是超类型/子类型,即

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

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

两者都只会在foo()中调用B的版本。

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

答案 2 :(得分:0)

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

在第二行中,您使用的是对象&b;#的引用。因此,您在其引用上调用的任何方法都将调用对象' b'的重写方法foo()。根据对象引用进行思考将有助于您清楚地理解OOPS的Java概念。

答案 3 :(得分: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() 未覆盖,因此将调用class 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