前言
- 继承主要解决的问题就是: 共性提取
- 在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当作父类看待。比如说父类 是员工类,子类是讲师类,那么“讲师就是一名员工”关系。它们之间的关系可形象地表达为 is a…
- @Override 重写方法注解,可以用来检测重写方法方法名和方法参数是否正确。
super、this关键字
super 关键字的用法有三种:
- 在子类的成员方法中,访问父类的 成员变量
- 在子类的成员方法中,访问父类的 成员方法
- 在子类的构造方法中,访问父类的 构造方法
子类构造方法中默认调用了super() 方法。如果父类定义了有参构造方法,默认的构造方法将不再提供,此时子类的构造方法就会报错。
public class Fu {
// 父类定义
public Fu() {
// 无参构造方法一定要给出,子类默认调用这个
System.out.println("父类");
}
public Fu(int num) {
// 有参构造方法
System.out.println("父类构造方法执行");
}
}
public class Zi extends Fu {
public Zi() {
// super(); // 隐含着;赠送着
super(20);
System.out.println("子类构造方法执行");
}
}
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() {
// super关键字访问父类中的成员变量
System.out.println(super.num);
}
@Override
public void method() {
super.method(); // super关键字访问父类中的method
System.out.println("子类方法");
}
}
super 关键字用来访问父类内容,而 this 关键字用来访问本类内容。用法也有三种:
- 在本类的成员方法中,访问本类的成员变量。
- 在本类的成员方法中,访问本类的另一个成员方法。
- 在本类的构造方法中,访问本类的另一个构造方法。(this(…)调用必须是构造方法的第一个语句,唯一一个)
public class Zi extends Fu{
int num = 20;
public Zi() {
this(123); // 本类的无参构造调用本类的有参构造,类似 super
}
public Zi(int n) {
}
public void shouNum() {
int num = 10;
System.out.println(num); // 局部变量
System.out.println(this.num); // 访问本类当中的num
System.out.println(super.num); // 访问父类当中的num
}
public void methodA() {
System.out.println("AAA");
}
public void methodB() {
this.methodA(); // 可以达到在本类中访问另一个成员方法的效果,this标志着是本类中的方法
System.out.println("BBB");
}
}
super 与 this 关键字内存图解
1 、 一定是class文件先去方法区,值得注意的是有继承关系的类进入方法区的时候,编译完之后 .class 文件中有一个特殊标记,它其实是一个指向,指向父亲,告诉父亲是谁,好比 extends关键字。
2 、 在 main方法进入方法栈创建子类 Zi 对象后,在堆内存是不是和平常一样呢?
一个子类对象包含一个完整的父类结构,先把父类内容构造好了,再在外围构造子类内容。里面是 父,外面是子,两层嵌套结构。
注意:堆当中方法保留的是地址值哦。
3、 在super 与 this 关键字的运用时,this 会去子类内容里去找,super会去父类内容里面去找 。子类调用 method 方法中有super.method() 所以会去父类内容找到方法地址。
Java继承的三个特点
- Java 语言是单继承的。 一个类的直接父类只能有唯一一个。
- Java 语言可以多级继承。我父亲还有父亲。
- 一个父类可以拥有很多个子类。可以有很多个兄弟姐妹。