在java的笔试中,继承肯定是必考的,而java的继承有很多细节都值得我们去细细品味一番,下面就由我一一道来。

1.子类在实例化时,首先会隐式调用父类的无参构造函数。
例一:程序会输出什么结果?

public class FatherClass {
	public int a = 10;
	public FatherClass(){
		System.out.println("FatherClass");;
	}
}
public class ChildClass extends FatherClass{
	public ChildClass(){
		System.out.println("ChildClass");
	}
	public static void main(String[] args) {
		ChildClass child = new ChildClass();
		System.out.println(child.a);
	}
}

分析:其实道理很简单,如果不先调用父类的无参构造函数去对父类中的成员进行初始化,那子类怎么能够直接继承父类的公有成员呢?所以本程序会输出:

FatherClass 
 ChildClass 
 10

2.对象的多态性:子类实例化对象可以转化为父类实例化对象
例二:程序会输出什么结果?

public class Person {
	public void eat(){
		System.out.println("Person eat");
	}
	public void drink(){
		System.out.println("Person drink");
	}
}
public class Woman extends Person{
	public void drink(){
		System.out.println("Woman drink");
	}
	public void play(){
		System.out.println("Woman play");
	}
	public static void main(String[] args) {
		Person person = new Woman();
		person.eat();
		person.drink();
		person.play();
	}
}

分析:这个例子中,“Person”类有“eat”和“drink”两个方法,子类“Woman”继承了“Person”,并对“drink”方法进行了重写。在main方法中,创建了父类(Person)的对象(person),并由子类(Woman)去实例化,此时person对象是由子类(Woman)实例化而来的,这就完成了子类实例化对象转化为父类实例化对象的过程,此时的父类实例化对象(person)实际上是由子类实例化对象(woman)而来的,所以归根结底,person是一个父类实例化对象,它只拥有自身的方法,并且它的方法经过了子类的重写,而它没有子类所新添加的方法。所以person.eat()会输出Person eat,person.drink()会输出Woman drink(方法经过了子类的重写),而person. play()会出现编译时错误,因为他是person,不拥有woman的方法。

3.子类不能继承父类的私有成员
例三:程序会输出什么结果?

public class Father {
	private int age = 40;
	private void smoke(){
		System.out.println("Person eat");
	}
}
public class Child extends Father{
	public static void main(String[] args) {
		Child child = new Child();
		child.smoke();
		child.age;
	}
}

分析:子类在继承父类的时候,只能继承父类的公有成员,而不能继承父类的私有成员。本例中实例化的child不能直接调用父类的私有方法smoke()和私有变量age,毕竟儿子不能一生下来就和父亲一个岁数,也不会一生下来就会抽烟。但是儿子终究也是有岁数的,在这样的情况下,我们会给父类的私有变量添加get/set方法,以便子类设置自己的属性。若子类要使用父类的私有方法,这是不可能的,只能在子类中重新定义一个新的方法,而这个方法既不是对父类方法的重写,也不是对父类方法的重载,只是一个全新的方法,只不过名字一样罢了。例子如下:

public class Father {
	private int age =40;
	private void smoke(){
		System.out.println("father like smoke");
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
public class Child extends Father{
	private void smoke(){
		System.out.println("good child do not smoke");
	}
	public static void main(String[] args) {
		Child child = new Child();
		child.smoke();
		child.setAge(10);
		System.out.println(child.getAge());
	}
}

这时运行程序会输出:

good child do not smoke 
 10