我有一个A接口,其方法getT()
,abstract B class
方法getS()
和class C
扩展B class
implements A interface
。我正在覆盖A
子类中B
接口和C
超类的方法。然后在main
方法中,如果C
像这样A
,我将A obj = new C();
类实例化为:getT()
我能够从{{obj
调用getS()
1}},但无法调用getS()
方法。如何从obj
调用obj
方法,但我无法更改A
的类型,必须为public interface A {
public String getT();
}
。这是代码:
界面A:
public abstract class B implements A {
public abstract String getS();
}
抽象类B:
public class C extends B {
@Override
public String getT() {
System.out.println("method getT() from C class");
return null;
}
@Override
public String getS() {
return null;
}
}
子类C:
public class T {
public static void main(String[] args) {
A obj = new C();
obj.getT();
}
}
T类中的主要方法:
{{1}}
答案 0 :(得分:1)
使用A
类型的引用变量,您无法调用getS()
,因为它可能是实现A
的任何类型,例如AImplementer
,而不是B
从A
延伸。任何getS()
对象都不一定具有getT()
方法。它只能保证有obj
方法。
如果A
必须是getS()
类型,并且您需要调用getS()
,那么请在A
接口的定义中包含public interface A {
public String getT();
public String getS(); // Add this line.
}
方法:
B
然后A
仍然是getS()
,您可以在A
引用变量上调用static
。
顺便说一句,我在代码中没有看到任何{{1}}方法。静态方法无法覆盖。
答案 1 :(得分:1)
要获得对该方法的访问权限,您需要将obj向下转换为B.
所以你可以:
((B)obj).getS();
向下转发:http://www.programmerinterview.com/index.php/java-questions/downcasting-in-java/
答案 2 :(得分:0)
obj的类型类是A,但是A没有方法getS(),所以你不能在main方法中调用。 obj必须是B级或C级。