Java静态方法覆盖和接口

时间:2013-10-28 18:57:48

标签: java methods static override

我有一个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}}

3 个答案:

答案 0 :(得分:1)

使用A类型的引用变量,您无法调用getS(),因为它可能是实现A的任何类型,例如AImplementer,而不是BA延伸。任何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级。