/ / Java静的メソッドのオーバーライドとインターフェース-java、methods、static、override

Javaの静的メソッドのオーバーライドとインタフェース - 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() 方法。どうすれば電話できますか 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である必要があります。