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,所以还是原来的值。

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