1

我有一个带有方法的 A 接口getT()abstract B class带有方法getS(),并且class C扩展B class了 which implements A interface。我正在覆盖子类中的A接口和B超类的方法C。然后在main方法中我将C类实例化为 typeo 如果A这样:我A obj = new C();可以调用getT()from obj,但不能调用getS()方法。我怎样才能getS()从 调用方法obj,但我不能更改 的类型obj,它必须是A。这是代码:

接口 A:

public interface A {
    public String getT();
}

抽象类 B:

public abstract class B implements A {
    public abstract String getS();
}

子类 C:

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;
    }

}

以及 T 类内部的主要方法:

public class T {

    public static void main(String[] args) {
        A obj = new C();
        obj.getT();
    }

}
4

3 回答 3

1

使用 type 的引用变量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在您的代码中看不到任何方法。静态方法不能被覆盖。

于 2013-10-28T19:01:52.083 回答
1

要访问该方法,您需要将 obj 向下转换为 B。

所以你可以有:

((B)obj).getS();

向下转换:http : //www.programmerinterview.com/index.php/java-questions/downcasting-in-java/

于 2013-10-28T19:10:39.340 回答
0

obj 的类型类是 A,但是 A 没有方法 getS() 所以你不能在 main 方法中调用。obj 必须是 B 类或 C 类。

于 2013-10-28T19:05:13.113 回答