繁体   English   中英

Java静态方法覆盖和接口

[英]Java static methods overriding and interfaces

我有一个方法A接口getT() abstract B class与方法getS()class C ,其延伸B class ,其implements A interface 我从C子类中的A接口和B超类重写方法。 然后在main方法中,如果A像这样,我将C类实例化为typeo: A obj = new C(); 我'能够调用getT()obj ,但不能调用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类内部的主要方法:

public class T {

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

}

对于类型为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方法。 静态方法不能被覆盖。

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

因此,您可以:

((B)obj).getS();

下调: http//www.programmerinterview.com/index.php/java-questions/downcasting-in-java/

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM