【问题标题】:Java static methods overriding and interfacesJava 静态方法覆盖和接口
【发布时间】:2013-10-28 18:57:47
【问题描述】:

我有一个带有 getT() 方法的 A 接口,abstract B class 带有方法 getS()class C 扩展 B class implements A interface。我正在覆盖A 接口和C 子类中的B 超类中的方法。然后在main 方法中,我将C 类实例化为typeo,如果A 像这样:A obj = new C(); 我可以从obj 调用getT(),但不能调用getS()方法。如何从obj 调用getS() 方法,但是我不能更改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类里面的main方法:

public class T {

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

}

【问题讨论】:

  • 这些“静态方法”在哪里?这个“压倒一切”在哪里?

标签: java methods static overriding


【解决方案1】:

对于A 类型的引用变量,您不能调用getS(),因为它可以是实现A 的任何类型,例如AImplementer,它不从B 扩展。任何A 对象不一定有getS() 方法。它只保证有一个getT() 方法。

如果obj 必须是A 类型并且您需要调用getS(),则在A 接口的定义中包含getS() 方法:

public interface A {
    public String getT();
    public String getS(); // Add this line.
}

那么B 仍然是A,您可以在A 引用变量上调用getS()

顺便说一句,我在您的代码中没有看到任何 static 方法。静态方法不能被覆盖。

【讨论】:

  • 对不起,我提到了抽象方法
【解决方案2】:

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

所以你可以:

((B)obj).getS();

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多