Имам интерфейс с метод 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
обект няма задължително 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
методи във вашия код. Статичните методи не могат да бъдат отменени.
1 за отговор № 2
За да получите достъп до метода, ще трябва да свалите obj до B.
Така че можете да имате:
((B)obj).getS();
Даункастинг: http://www.programmerinterview.com/index.php/java-questions/downcasting-in-java/
0 за отговор № 3
типовият клас на obj е A, но A hasn "t метод getS (), така че не можете да се обадите в основния метод. obj трябва да е клас B или клас C.