一、继承
1.继承概念/好处
让类与类之间产生关系,这也是多态的前提;
子类可以直接使用父类中非私有的成员;
2.继承代码格式
extents关键字
public class 子类名称 extends 父类名称{ }
3.继承的作用/用途
- 继承好处(开发中)
- 提高了代码的复用性(多个类相同的成员可以放到同一个类中);
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可);
- 继承弊端
- 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性;
- 继承的应用场景:
- 使用继承,需要考虑类与类之间是否存在is…a的关系,不能盲目使用继承;
- is…a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类;
- 使用继承,需要考虑类与类之间是否存在is…a的关系,不能盲目使用继承;
4.继承的特点
- 只支持单继承,不支持多继承,意思就是extends后面只能写一个类名
举例:calss A extends B,C { } //这是错误的
-
类支持多层继承
也就是说父与子之间,父可以有多个子,也可以有多个子孙类(感觉又是经典套娃);
public class Granddad {
public void drink() {
System.out.println("我爱喝酒");
}
}
public class Father extends Granddad {
public void smoke() {
System.out.println("我爱抽烟");
}
}
public class Mother {
public void dance() {
System.out.println("我爱跳舞");
}
}
public class Son extends Father {
// 此时,Son类中就同时拥有drink方法以及smoke方法
}
5.成员变量的访问特点
在子类方法中访问一个变量,采用的是就近原则。
- 先从子类局部范围找
- 再从子类成员范围找
- 再从父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
如果一定要使用父类的,可以通过super关键字,进行区分
6.关键字:this和super的使用
- this&super关键字:
- this:代表本类对象的引用
- super:代表父类存储空间的标识(可以理解为父类对象引用)
- this和super的使用分别
- 成员变量:
- this.成员变量 - 访问本类成员变量
- super.成员变量 - 访问父类成员变量
- 成员方法:
- this.成员方法 - 访问本类成员方法
- super.成员方法 - 访问父类成员方法
- 成员变量:
- 构造方法:
- this(…) - 访问本类构造方法
- super(…) - 访问父类构造方法
7.继承中成员方法的访问特点
当子类和父类中出现了相同的方法时,调用子类中的方法是子类的方法;
注意:我们在调用一个类的成员变量和成员方法时,系统会默认的在前面加上this关键字;
8.方法重写
-
方法重写概念
- 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
-
方法重写的应用场景
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
-
Override注解
- 用来检测当前的方法,是否是重写的方法,起到【校验】的作用
-
方法重写的注意事项
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法访问权限不能更低(public > 默认 > 私有)
- 静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法
public class Fu {
private void show() {
System.out.println("Fu中show()方法被调用");
}
void method() {
System.out.println("Fu中method()方法被调用");
}
}
public class Zi extends Fu {
/* 编译【出错】,子类不能重写父类私有的方法*/
@Override
private void show() {
System.out.println("Zi中show()方法被调用");
}
/* 编译【出错】,子类重写父类方法的时候,访问权限需要大于等于父类 */
@Override
private void method() {
System.out.println("Zi中method()方法被调用");
}
/* 编译【通过】,子类重写父类方法的时候,访问权限需要大于等于父类 */
@Override
public void method() {
System.out.println("Zi中method()方法被调用");
}
}
9.权限修饰符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJXsHxkk-1666688104726)(C:\Users\Administrator\Desktop\02_权限修饰符.png)]
10.继承中构造方法的访问特点
- 子类中所有的构造方法默认都会访问父类中无参的构造方法!
- 原因:子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据,所以子类初始化之前,一定要先完成父类初始化;每一个子类构造方法的第一条语句默认都是:super()
- 注意: 如果我们编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最顶层父类)
- 所有构造方法的第一条默认语句都是:super();
11.代码修改原则
的数据,所以子类初始化之前,一定要先完成父类初始化;每一个子类构造方法的第一条语句默认都是:super()
- 注意: 如果我们编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最顶层父类)
- 所有构造方法的第一条默认语句都是:super();
11.代码修改原则
- 开闭原则,对扩展开发对修改关闭,尽量在不更改原有代码的前提下以完成需求,是为了使程序的扩展性好,易于维护和升级;