1. 程式人生 > >JAVA父類子類轉化問題

JAVA父類子類轉化問題

1、可以用父類去宣告子類物件

2、可以將父類物件強轉為子類物件,前提是隻有父類物件本身就是用子類new出來的時候, 才可以在將來被強制轉換為子類物件

例項如下:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
	}
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		b = (B) a;
		System.out.println(b.x);
	}
}

會出現如下報錯:

正確做法:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
	}
	public static void main(String[] args) {
		A a = new B();
		B b = new B();
		b = (B) a;
		System.out.println(b.x);
	}
}

結果如下:

那麼再來考慮一下,用父類宣告的子類物件,到底是父類還是子類,看下邊例項:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
		public void print(){
			System.out.println("I am A");
		}
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
		public void print(){
			System.out.println("I am B");
		}
	}
	public static void main(String[] args) {
		A a = new B();
		System.out.println(a.x);
		a.print();
	}
}

結果如下:

到這裡相比大家已經明白,用父類宣告的子類,變數不會被覆蓋,而方法會被覆蓋,這是因為,基本資料型別採用的是值傳遞,因而不會將父類的變數的值覆蓋,而方法採用的是引用傳遞,因此會覆蓋,java的引數傳遞詳見:java引數傳遞詳解