继承性是面向对象的第二特征,可以更好的解决参数统一的问题
一、使用简单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 { } //同时继承了A和B两个父类
之所以会存在这样的继承关系,主要目的是为了让C同时具备A,B两个类的所有操作,那么就采用多层继承。
2. 正确的继承关系
class A { }
class B extends A { }
class C extends B { } //同时继承了A和B两个父类
此时C类具备了A、B两个类的所有功能,但多层继承最好不超过三成;
限制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准备的,即:子类构造执行之前一定要先调用父类构造;