一.继承的入门介绍
(1)继承的概念理解
让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员
(2)通过extends关键字实现继承
格式:public class 子类名 extends 父类名 { }
范例:public class Zi extends Fu { }
Fu:是父类,也被称为基类、超类
Zi:是子类,也被称为派生类
二.继承的好处和弊端
(1)继承的好处
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提
(2)继承的弊端
继承是侵入性的
降低了代码的灵活性
继承关系,导致子类必须拥有父类非私有属性和方法,让子类自由的世界中多了些约束
增强了代码的耦合性
代码与代码之间存在关联都可以将其称之为"耦合"。
(3)耦合性:代码与代码之间存在关联都可以将其称之为"耦合"。
图:05/0_耦合性关系说明图.PNG
(4)什么时候使用继承?
当类与类之间,存在相同 (共性) 的内容,并且产生了 is a 的关系,就可以考虑使用继承,来优化代码。
举例:
学生:姓名,年龄 项目经理:姓名,工号,工资
老师:姓名,年龄 程序员:姓名,工号,工资
人:姓名,年龄 员工:姓名,工号,工资
(5)继承的好处和弊端总结
好处:提高了代码的(复用性、维护性),是多态的前提
弊端:降低了代码灵活性,增强了代码的耦合性
三.继承的特点
(1)Java只支持单继承,不支持多继承,但支持多层继承。
单继承:子类只能继承一个父类
不支持多继承:子类不能同时继承多个父类
(2)问题: 为什么不支持多继承?
public class 父类A { public void method(){System.out.println("复习数学"); } }
public class 父类B { public void method(){ System.out.println("复习语文");} }
public class 子类 extends 父类A , 父类B { }
public class Test {
public static void main(String[] args) {
子类 z = new 子类();
z.method(); // 复习啥?懵了!不知道调用哪个了。
}
}
四.继承的成员变量访问特点
在子类方法中访问一个变量
子类局部范围找 --没有–>子类成员范围找 --没有–> 父类成员范围找。
注意:
如果子父类中,出现了重名的成员变量,通过就近原则,会优先使用子类的
如果一定要使用父类的,可以通过super关键字,进行区分。
案例:
public class Fu { int a = 10; }
public class Zi extends Fu {
// 子父类当中, 出现了重名的成员变量
int a = 20;
public void method(){
int a = 30;
System.out.println(a); //子类局部范围找 --没有-->子类成员范围找 --没有--> 父类成员范围找 【30】
//需求1: 在控制台打印本类成员变量 20
System.out.println(this.a); //通过this关键字
//需求2: 在控制台打印父类成员变量 10
System.out.println(super.a); //通过super关键字
}
}
五.继承的成员变量访问特点
super 关键字的用法和 this 关键字的用法相似
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)
图:05/1_this和super访问使用说明.PNG
六.方法重写
(1)方法重写概述
在继承体系中,子类出现了和父类中一模一样的方法声明
(2)方法重写的应用场景
当子类需要父类的功能,而功能主体子类有自己特有内容,可以重写父类中的方法,
这样,即沿袭了父类的功能,又定义了子类特有的内容
(3)注意:
方法重写: 在继承体系中, 子类出现了和父类一模一样的方法声明 (方法名, 参数列表, 返回值类型)
方法重载: 在同一个类中, 方法名相同, 参数列表不同, 与返回值无关.
(4)练习:手机类和新手机类
public class iPearV1 {
/*
1. 定义手机类 iPearV1
call(String name) : 打电话方法
smallBlack() : 语音助手 (speak english...)
*/
public void call(String name){
System.out.println("给" + name + "打电话");
}
public void smallBlack(){
System.out.println("speak english...");
}
}
public class iPearV2 extends iPearV1 {
/*
2. 定义新手机类 iPearV2
call(String name) : 打电话方法
smallBlack() : 语音助手 (speak english... 说中文)
方法重写的应用场景:
当子类需要父类的功能,而功能主体子类有自己特有内容
可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
*/
public void smallBlack(){
super.smallBlack();
System.out.println("说中文");
}
}
public class TestOverride {
/*
需求:
1. 定义手机类 iPearV1
call(String name) : 打电话方法
smallBlack() : 语音助手 (speak english...)
2. 定义新手机类 iPearV2
call(String name) : 打电话方法
mallBlack() : 语音助手 (speak english... 说中文)
注意:
方法重写: 在继承体系中, 子类出现了和父类一模一样的方法声明 (方法名, 参数列表, 返回值类型)
方法重载: 在同一个类中, 方法名相同, 参数列表不同, 与返回值无关.
*/
public static void main(String[] args) {
iPearV2 i = new iPearV2();
i.smallBlack();
}
}
七:方法重写注意事项
(1)父类中私有方法不能被重写
(2)父类静态方法,子类必须通过静态方法进行重写,父类非静态方法,子类也必须通过非静态方法进行重写
注意:静态方法不能被重写!如果子类中,也存在一个方法声明一模一样的方法
可以理解为,子类将父类中同名的方法,隐藏了起来,并非是方法重写!
(3)子类重写父类方法时,访问权限必须大于等于父类