メソッド付きの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()
方法。どうすれば電話できますか 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();
}
}
回答:
回答№1は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
コード内のメソッド。静的メソッドはオーバーライドできません。
回答№2の場合は1
メソッドにアクセスするには、objをBにダウンキャストする必要があります。
だからあなたは持つことができます:
((B)obj).getS();
ダウンキャスティング: http://www.programmerinterview.com/index.php/java-questions/downcasting-in-java/
回答№3の場合は0
objの型クラスはAですが、AにはgetS()メソッドがないため、mainメソッドを呼び出すことはできません。 objはクラスBまたはクラスCである必要があります。