一、父類引用指向子類對象時
1、若子類覆蓋了某方法,則父類引用調用子類重新定義的新方法
2、若子類未覆蓋某方法,則父類引用調用父類本身的舊方法
3、若子類覆蓋了某屬性,但父類引用仍調用父類本身的舊屬性
4、若子類未覆蓋某屬性,則父類引用調用父類本身的舊屬性
5、父類引用不能訪問子類新定義的方法
二、子類引用指向自身對象時
1、若子類覆蓋了某方法,則子類引用調用子類重新定義的新方法
2、若子類未覆蓋某方法,則子類引用調用父類本身的舊方法
3、若子類覆蓋了某屬性,則子類引用調用子類重新定義的新屬性
4、若子類未覆蓋某屬性,則子類引用調用父類本身的舊屬性
5、子類引用可以訪問子類新定義的方法
三、示例代碼
B.java
- 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
