1. 程式人生 > >Java中的繼承:父類和子類的關係

Java中的繼承:父類和子類的關係

一、父類引用指向子類物件時

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