Java中的繼承:父類和子類的關係
阿新 • • 發佈:2019-02-11
一、父類引用指向子類物件時
1、若子類覆蓋了某方法,則父類引用呼叫子類重新定義的新方法
2、若子類未覆蓋某方法,則父類引用呼叫父類本身的舊方法
3、若子類覆蓋了某屬性,但父類引用仍呼叫父類本身的舊屬性
4、若子類未覆蓋某屬性,則父類引用呼叫父類本身的舊屬性
5、父類引用不能訪問子類新定義的方法
二、子類引用指向自身物件時
1、若子類覆蓋了某方法,則子類引用呼叫子類重新定義的新方法
2、若子類未覆蓋某方法,則子類引用呼叫父類本身的舊方法
3、若子類覆蓋了某屬性,則子類引用呼叫子類重新定義的新屬性
4、若子類未覆蓋某屬性,則子類引用呼叫父類本身的舊屬性
5、子類引用可以訪問子類新定義的方法三、示例程式碼
public class B {
int a = 1;
int b = 2;
void f1() {
System.out.println("B.f1()");
}
void f2() {
System.out.println("B.f2()");
}
}
C.java
public class C extends B { int a = 3; @Override void f1() { System.out.println("C.f1()"); } void f3() { System.out.println("C.f3()"); } public static void main(String[] args) { B b = new C();// 父類引用指向子類物件 b.f1();// 子類覆蓋了該方法,所以父類引用呼叫新方法 b.f2();// 子類未覆蓋該方法,所以父類引用呼叫舊方法 // b.f3();此行去掉註釋會報錯,父類引用不能訪問子類新定義方法 System.out.println(b.a);// 子類覆蓋了該屬性,但父類引用仍舊訪問舊屬性 System.out.println(b.b);// 子類未覆蓋該屬性,父類訪問舊屬性 System.out.println(); C c = new C();// 子類引用指向自身物件 c.f1();// 子類覆蓋了父類方法,所以呼叫新方法 c.f2();// 子類未覆蓋父類方法,所以呼叫舊方法 c.f3();// 子類呼叫自己新定義的方法 System.out.println(c.a);// 子類覆蓋了該屬性,所以訪問新屬性 System.out.println(c.b);// 子類未覆蓋該屬性,所以訪問舊屬性 } }
輸出:
C.f1()
B.f2()
1
2
C.f1()
B.f2()
C.f3()
3
2