继承

继承性是面向对象的第二特征,可以更好的解决参数统一的问题

一、使用简单java类的开发的代码

1. Person类定义

 

2. Student类定义

 

上面的明显的问题代码出现了重复的情况,而从现实来讲学生一定是人,但是学生和人相比,学生要比人表现的更加具体,人的范围更加广泛;

二、继承的使用

1. Java中可以使用extends关键字来实现继承的关系,但是严格来讲extends表示的是“扩充、扩展的意思”意思指的是扩充已有类的功能

2. 继承语法

class 子类 extends 父类();

而此时子类有时也成为派生类,而父类也会称为超类(super class)。

 

范例1:实现继承

 

此时student类就集成了person的子类,虽然此时student类中没有写任何代码,也可以直接使用person类中定义的结构;

 

一旦使用了继承那么子类将具备父类之中的全部功能。在程序中,子类可以选择性对父类的功能进行扩充,如果不需要也可以不扩充任何方法,即:子类至少会维持父类中的全部操作

 

范例2:子类的扩充操作

 

 

此时已经满足了最初的要求,代码没有重复了,在类功能扩充时若是相关类可以使用继承;

三、继承限定

虽然继承可以进行类功能的扩充,但继承也会有若干限制

限制1:在Java中一个类只允许继承一个父类

c++中一个子类可以同时继承多个父类,这叫多重继承,但在Java中不允许;

 

范例3:多层继承

1. 错误的继承关系

class  A { }

class  B { }

class  C extends A , B { }  //同时继承了AB两个父类

之所以会存在这样的继承关系,主要目的是为了让C同时具备A,B两个类的所有操作,那么就采用多层继承。

2. 正确的继承关系

class  A { }

class  B  extends  A { }

class  C extends  B { }  //同时继承了AB两个父类

此时C类具备了AB两个类的所有功能,但多层继承最好不超过三成;

限制2:子类不可直接访问父类的私有操作;

范例4

1. 子类直接访问父类私有属性错误的逻辑

class  Person {

Private String name;   //父类私有操作

}

class  Student  extends Person {

Public void set( ){

This.name=hello;  //子类访问父类的私有属性

}

 }  

2. 子类通过set/get方法访问父类属性

如范例2

结论:

子类会继承父类中全部操作,包括父类的私有属性也会被子类继承,但不能直接访,所以称为隐式继承;而所有的公共操作(public)可以直接访问,称为显示继承;

限制3

子类对象在进行对象实例化之前,会默认调用父类构造(默认执行父类无参构造方法),而后再调用子类构造,为子类对象实例化。

范例5:子类对象实例化

1. 父类提供无参构造情况,直接使用super()或者不写

 

 

 

此时,就相当于在子类构造方法之中隐含了一个super()”的语句,表示由子类调用父类的构造方法,如果没传递参数,表示调用无参,这样的语句只能放在子类构造方法的首行;

上面的代码相当于:

 

2. 父类提供的有参构造—子类必须 super(加上参数

 


如果父类没有无参构造,子类在调用的时候必须明确的使用super(参数)调用构造;

3. 疑问:

有一个疑问出现了,发现this()要放在构造方法首行,而super()也要放在构造方法首行,如果在构造方法首行编写了“this()”表示不能出现“super()”那么是不是就表示可以不去调用父类构造,而实现直接调用子类构造

在使用this( )调用本类构造方法时,一定要留一个出口就是给super准备的,即:子类构造执行之前一定要先调用父类构造;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值