java中的继承细节

在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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值