我有一个名为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();
我在这里做错了吗?任何帮助将不胜感激。
答案 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
为假,会发生什么?