如何从抽象类实例化子类对象时访问子类方法

时间:2014-01-18 04:43:30

标签: java class subclass instantiation abstract

我有一个名为A的抽象类和一个从它扩展而来的类B.在A类中,我有一个方法的具体实现,我也有抽象方法。在B类中,我已经覆盖了所有抽象方法和自己的方法。

public abstract A{
   public boolean myConcreteMethod(){
      //implementation
   }

   public abstract void abstractMethod();
}

public class B extends A{
   @Override
   public void abstractMethod(){
       //implementation
   }

   public String aMethodBelongsToB(){
       //implementation
   }
}

现在我实例化B的对象如下:

 A test = new B();

我无法访问

 test.aMethodBelongsToB();

我在这里做错了吗?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

你没有B参考。所以,你不能称之为方法。你必须做到它

B test = new B();

现在,B可以访问A的方法。因为B在OOP术语中是A. IS-A的关系!

答案 1 :(得分:0)

当您实例化类B时,您使用的引用变量类型为A。从此引用中,您只能访问A中声明的方法。该引用还可以指向继承自A的其他类,它们不会在B中声明方法,因此编译器不允许您调用仅在引用中声明的子类中的方法一个超类。

答案 2 :(得分:0)

当您为B类型的变量分配A值时,Java语言表示无法调用B特定的方法。要么这样做:

    B test = new B();
    test.aMethodBelongsToB();

或者这个:

    A test = new B();
    ((B) test).aMethodBelongsToB();   

注意:由于我们正在向test投射B,现在可以在类型转换子表达式的结果上调用B特定的方法。


变量/ expression的声明类型始终确定可以调用哪些方法(签名)。实际的对象引用仅确定调用哪个实际方法(如果存在方法覆盖)。要了解原因,请考虑以下事项:

public class C extends A{
   @Override
   public void abstractMethod(){
       //implementation
   }
   ...
}

和这(这是无效的Java ...):

A test;
if (something) {
    test = new B();
} else {
    test = new C();
}
test.aMethodBelongsToB();  // INVALID

如果最后一个陈述是合法的(并且它不是!!)如果something为假,会发生什么?