1、继承的概念
- 面向对象三大特征:封装性,继承性,多态性。继承是多态的前提,没有继承就没有多态。
- 继承主要解决的问题:共性抽取。
- 继承关系当中的特点:①子类可以拥有父类的“内容”;②子类还可以拥有自己的内容。
- 在继承关系中,“子类就是一个父类”。也就是说,子类可以被当做父类来看,如父类是员工,子类是讲师,那么,“讲师就是员工”。
2、继承的格式
- 定义父类(一个普通的类定义):
public class 父类名{} - 定义子类:
public class 子类名 extends 父类名{}
public class Employee { //父类
public void method(){
System.out.println("父类方法执行");
}
}
public class Teacher extends Employee{ //子类1
//什么也没有
}
public class Assistant extends Employee{ //子类2
//什么也没有
}
public class DemoJicheng {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.method(); //父类方法执行 子类可以拥有父类的内容
Assistant assistant = new Assistant();
assistant.method(); //父类方法执行
}
}
3、继承中成员变量的访问特点
- 在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找;
- 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找。
- 区分子类方法中重名的三种变量:
- 局部变量:直接写成员变量名;
- 本类的成员变量:this.成员变量名
- 父类的成员变量:super.成员变量名
public class Fu { //父类
int num =10; //父类成员变量
}
public class Zi extends Fu { //子类
int num = 20; //本类的成员变量
public void method(){
int num = 30; //局部变量
System.out.println(num); //30 局部变量
System.out.println(this.num); //20 本类的成员变量
System.out.println(super.num); //10 父类的成员变量
}
}
public class DemoThisSuper {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method(); //30 20 10
}
}
4、继承中成员方法的访问特点
- 在父子类的继承关系中,创建子类对象,访问重名成员方法的规则:创建的对象是谁,就优先用谁,如没有,则向上找。
- 无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找子类。
5、继承中方法的覆盖重写
- 重写(Override):在继承关系中,方法的名称一样,参数列表也一样。
- 重载(Overloa):方法名称一样,参数列表不一样。
- 方法覆盖重写的特点:创建的是子类对象,则优先用子类方法。
6、方法重写的注意事项
- 覆盖重写必须方法名称一样,参数列表也一样,在子类重写方法前写上@Override可以用来检测是否是有效正确的覆盖重写。(也可省略,推荐写上)
- 子类方法的返回值必须小于等于父类方法的返回值类型。
- 子类方法的权限必须大于等于分类方法的权限修饰符。(public>protected>不写>private)
- 什用时候用:对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性的内容,并添加改动新的内容——继承、重写
7、继承中构造方法的访问特点
- 子类构造方法中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行子类的构造。
- 子类构造可以通过super关键字来调用父类重载构造。
- super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造。
- 所以,子类必须调用父类构造方法,不写则赠送super(),写了则用写的指定的super调用,super只能有一个,且必须是第一个语句。
8、super关键字的用法
- 在子类的成员方法中,访问父类的成员变量。
- 在子类的成员方法中,访问父类的成员方法。
- 在子类的成员方法中,访问父类的构造方法。
public class Fu { //父类
int num =10; //父类成员变量
public void method(){
System.out.println("父类方法");
}
}
public class Zi extends Fu { //子类
int num = 20; //本类的成员变量
public Zi(){
super(); //访问父类构造方法
}
public void methodZi(){
System.out.println(super.num); //访问父类成员变量
}
public void method(){
super.method(); //访问父类成员方法
System.out.println("子类方法");
}
}
public class DemoThisSuper {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method(); //父类方法
//子类方法
}
}
9、this关键字的用法
- 在本类的成员方法中,访问本类的成员变量。
- 在本类的成员方法中,访问本类的另一个成员方法。
- 在本类的成员方法中,访问本类的另一个构造方法。
- this(…)调用也必须是构造方法的第一个语句,唯一一个。
public class Fu { //父类
int num =30; //父类成员变量
public void method(){
System.out.println("父类方法");
}
}
public class Zi extends Fu { //子类
int num = 20; //本类的成员变量
public Zi(){
this(123); //本类的无参构造调用本类的有参构造
}
public Zi(int n){
this(1,2); //调用本类中另一个构造方法
}
public Zi(int n,int m){ //不能再有this()
}
public void showNum(){
int num = 10;
System.out.println(this.num); //本类的成员变量 10
System.out.println(super.num); //父类的成员变量 30
}
public void methodA(){
System.out.println("AAA"); //访问父类成员变量
}
public void methodB(){
this.methodA(); // 调用本类中另一个成员方法
System.out.println("BBB");
}
}
public class DemoThisSuper {
public static void main(String[] args) {
Zi zi = new Zi();
zi.showNum(); // 20 30
zi.methodB(); // AAA BBB
}
}
10、super与this关键字的内存图
11、java继承的三个特征
- 一个类的直接父类只能有唯一一个。
- java语言可以多级继承。
- 一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类。