Я просто пытался понять абстрактные классы и интерфейсы подробно с помощью java. Я прочитал несколько вопросов в SO, связанных с переопределением и внедрением одного и того же метода подписи из абстрактного класса и интерфейса.
После этого я просто попытался использовать свой собственный код, чтобы лучше понять концепцию. Затем я наткнулся на несколько вопросов:
A
и I
, если объект имеет тип C
?Я пробовал с приведенным ниже кодом:
public class TestMethods {
public static void main(String[] args) {
C c1 = new C();
c1.methodOne();
c1.methodTwo();
// Q.1
A c2 = new C();
// HOW TO CALL METHOD IN CLASS A WITH c2
c2.methodOne(); // I want to call here methodOne() from A
// Q.2
I c3 = new C();
A c4 = (A) c3;
// WILL THIS TYPE CASTING WORKS
// HOW TO CALL METHOD IN CLASS A WITH c4
c4.methodOne();
c4.methodTwo();
}
}
class C extends A implements I{
@Override
public void methodTwo() {
System.out.println("Method Two in Concrete Class C");
}
@Override
public void methodOne(){
System.out.println("Method One in Concrete Class C");
}
}
abstract class A{
public void methodOne(){
System.out.println("Method One in Abstract Class A");
}
public abstract void methodTwo();
}
interface I{
public void methodOne();
public void methodTwo();
}
ADDED
Q.3
Согласно предложению в одном из ответов ниже, я могу назвать super.methodOne()
из класса C
Но что, если у меня нет вызова super из моего конкретного класса C
для вызова конкретного метода из его расширяющегося родительского абстрактного класса A
? И мне не нужна модификация для моего конкретного класса C
, тогда я смогу вызвать метод в суперклассе?
super.methodOne()
метода super.methodOne()
super.methodOne()
, потому что я хочу вызвать после того, как я создал объект c2
. Я попытался с вызовом ((A)c2).methodOne()
но он все еще вызывает метод из C
В вопросе Q.2 у меня возник вопрос: можно ли привести ссылку I
на ссылку A
, если объект относится к типу C
super.methodOne()
из любого места внутри класса C. 2. Да, вы можете, но только если вы уверены, что это объект типа A или C.