java面試中多態的細節問題

話不多說,先貼代碼

package com.chenxin;

public class TestForPolymorphism {
	public static void main(String[] args) {
		Cat catee = new Cat(10);
		catee.makeVoice();
	}
	
	static abstract class Animal {
		private int age = 100;

		public Animal(int age) {
			this.age = age;
		}
		
		public abstract void makeVoice();
	}
	
	static class Cat extends Animal {
		private int age = 20;
		
		public Cat(int age) {	//當父類定義了有參構造方法,而沒有重寫無參構造方法時,必須繼承父類有參構造方法
			super(age);			//而且,該構造方法中必須調用父類構造方法
		}

		@Override
		public void makeVoice() {
			System.err.println("miao, my age is: " + age);
		}
		
	}
}

輸出爲:miao, my age is: 20。也就是Cat預定義的變量值。

如果改爲如下:

package com.chenxin;

public class TestForPolymorphism {
	public static void main(String[] args) {
		Cat catee = new Cat(10);
		catee.makeVoice();
	}
	
	static abstract class Animal {
		protected int age = 100;

		public Animal(int age) {
			this.age = age;
		}
		
		public abstract void makeVoice();
	}
	
	static class Cat extends Animal {
		
		public Cat(int age) {	//當父類定義了有參構造方法,而沒有重寫無參構造方法時,必須繼承父類有參構造方法
			super(age);			//而且,該構造方法中必須調用父類構造方法
		}

		@Override
		public void makeVoice() {
			System.err.println("miao, my age is: " + age);
		}
		
	}
}

即可得到預期輸出:miao, my age is: 10

首先,父類中寫了一個有參構造方法,那麼默認的無參構造方法就沒有了。子類繼承父類時,必須重寫此構造方法,而且必須在第一行調用super(age)父類構造方法。因爲在生成自身實例時,會先調用父類構造方法。

debug得知,在第一個例子中,我們傳入參數10。執行順序可以參照http://blog.csdn.net/xiangaichou/article/details/19993551

圍繞age變量進行闡述,在父類中,首先初始化方法塊的age=100,然後執行構造方法,age=10;然後是子類,注意這裏,在方法塊時就將age改爲了自己的20,之後沒有其他針對age的操作了。

所以這個“多態”問題,主要還是考察新建實例時的執行機制。


第二個例子就簡單了。。。因爲子類沒有再重新更改age,所以還是原來的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章