继承
生活中的“继承”是施方的一种赠与,受方的一种获得。
将一方所有的东西给予另一方。→往往二者之间具有继承关系(直系、亲属)
程序中的继承
- 程序中的继承,是类与类之间特征和行为的一种赠与或获得。
- 两个类之间的继承关系,必须满足“is a” 的关系。
父类的选择
-
现实生活中,很多类别之间都存在着继承关系,都满足“is a”的关系。
-
狗是一种动物、狗是一种生物、狗是一种物质。
-
多个类别都可以作为“狗”的父类,需要从中选择出最适合的父类。
- 功能越精细,重合点越多,越接近直接父类。
- 功能越粗略,重合点越少,越接近Object类。(万物皆对象概念)
父类的抽象
实战:可根据程序需要使用到的多个具体类,进行共性抽取,进而定义父类。
package com.xu.three;
/**
* 动物类(父类)
* @author 【徐先生】
*
*/
public class Animal {
//属性
//品种
String breed;
//年龄
int age;
//性别
String sex;
//方法、行为
public void eat() {
System.out.println("吃......");
}
public void sleep() {
System.out.println("睡......");
}
}
package com.xu.three;
/**
* 狗狗类
* @author 【徐先生】
*
*/
public class Dog extends Animal {
/*//属性
//品种
String breed;
//年龄
int age;
//性别
String sex;
*/
//毛色
String furColor;
/*//方法、行为
public void eat() {
System.out.println("吃......");
}
public void sleep() {
System.out.println("睡......");
}
*/
public void run() {
System.out.println("跑......");
}
}
package com.xu.three;
/**
* 鸟类
* @author 【徐先生】
*
*/
public class Bird extends Animal {
/*//属性
//品种
String breed;
//年龄
int age;
//性别
String sex;
*/
//毛色
String furColor;
/*//方法、行为
public void eat() {
System.out.println("吃......");
}
public void sleep() {
System.out.println("睡......");
}
*/
public void fly() {
System.out.println("飞");
}
}
//等等......以此类推,减少代码的冗余,
- 语法:class 子类 extends 父类{} //定义子类时,显示定义父类
- 应用:产生继承关系之后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法。
- 好处:既提高代码的复用性,又提高代码的可扩展性。
继承的特点
不可被继承
-
构造方法:
• 类中的构造方法,只负责创建本类对象,不可继承。
-
private 修饰的属性和方法:
❂访问修饰符的一种,仅本类可见。
-
父子类不在同一个package中时,default修饰的属性和方法:
❂访问修饰符的一种,仅同包可见。
访问修饰符
本类 | 同包 | 非同包子类 | 其他 | ||
---|---|---|---|---|---|
private | ✔ | ✖ | ✖ | ✖ | 严 |
default | ✔ | ✔ | ✖ | ✖ | ⇩ |
protected | ✔ | ✔ | ✔ | ✖ | ⇩ |
public | ✔ | ✔ | ✔ | ✔ | 宽 |
※default,不能写,它是默认的。
方法的覆盖
-
思考:子类是否可以定义和父类相同的方法?
-
思考:为社么需要在子类中定义和父类相同的方法?
-
分析:当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖(Override)。
-
方法覆盖原则:
✧方法名称、参数列表、返回值类型必须与父类相同。
✦访问修饰符不能比父类更严格。
-
方法覆盖的执行:
✦子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。
super关键字
-
在子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽、方法覆盖)时,需要加以区分,才可以专项访问。
-
使用“super. "的形式访问父类的方法,进而完成在子类中的复用;再叠加额外的功能代码,组成新的功能。
继承中的对象创建
- 在具有继承关系的对象创建中,构建子类对象会先构建父类对象。
- 由父类的共性内容,叠加子类的独有内容,组合成完整的子类对象。
继承后的对象构建过程
- 构建子类对象时,先构建父类对象。
super
- super()默认调用父类的无参构造
super调用父类的有参构造
super(父类参数)
this与super
- this表示当前对象引用,调用本类(包括继承)的属性、方法、本类构造方法
- super表示父类对象引用,调用父类的属性、方法、构造方法
this 或super 使用在构造方法中时,都要求在首行。
当子类构造中使用了this()或this(实参),
即不可再同时书写super()或super(实参),
会由this()指向的构造方法完成super()的调用。