一、继承的一些细节
- 子类继承所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有的属性和方法不能在子类直接访问,要通过父类提供的公共方法去访问。
- 子类没有继承父类的构造器,但必须调用父类的构造器,完成父类的初始化。
- 当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类构造器中用super去指定使用父类的哪一个构造器完成对父类的初始化。
- 如果希望指定去调用父类的某一个构造器,需要显性调用super(形参列表)。
- super在使用时候,必须放在第一行,super只能在构造器中使用。super()和this()只能放在第一行,所有二者不能共存一个构造器。
- Java所有类都是Object类的子类。父类构造器的调用会一直追溯到Object类。
- 子类最多只能直接继承一个父类(但是可以C继承B,B继承A)。
- 子类和父类要有逻辑关系。
二、JVM的内存:内存的继承布局
对象引用:在 Java 中,对象的引用是指向堆中对象的"指针"。在栈内存中存储的是对象引用(类似C的指针),而不是对象本身。当使用 new 关键字创建一个对象时,返回的是对象在堆中的地址,这个地址被存储在栈中的引用变量中。

- 按程序运行先new一个Son对象,就必须先加载Son的父类是Father,就必须先加载Father的父类GrandPa,以此类推就必须先加载顶层父类Object,所以方法区类信息的加载顺序 Object --> Grandpa --> Father --> Son(加载的类之间有继承关系)。
- 在堆中开辟一块空间给GrandPa存放他的属性name和hobby,而”大头爷爷“、”旅游“是字符串常量,存放在常量池中,所以堆中存放的是常量的引用,并指向常量池中的字符串常量。
- 同上一步在0X11加载出Father的常量的引用,需要注意的是:虽然爷类和父类都有name属性,但是二者不冲突,可以认为是0X11又在内部开辟了空间。age属性由于是基本数据类型,就在堆中直接生成了。儿子的属性的加载同上。
🆗,程序开始运行
- 程序开始运行
Son son = new Son(),第一步是加载属性的类(即 Object --> Grandpa --> Father --> Son)。 - 在堆里分配空间0X11,并加载各种属性。
- 加载完成后把堆里空间0X11返回给主方法里的son对象引用。
son的访问规则(重点)
public class Extends_ {
public void main(String[] args) {
Son son = new Son();
System.out.println(son.name);//输出大头儿子
System.out.println(son.age);//输出39
System.out.println(son.hobby);//输出旅游
}
class GradPa {
String name = "大头爷爷";
String hobby = "旅游";
}
class Father extends GradPa {
String name = "大头爸爸";
int age = 39;
}
class Son extends Father {
String name = "大头儿子";
}
}
通过对象引用访问实例成员属性,要按照查找关系来返回信息,如下:
(1)首先看子类是否有该属性;
(2)如果子类有这个属性,并且可以访问,则返回信息;
(3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息;
(4)如果父类没有就按照(3)的规则,继续找上级父类,直到 Object;
三、Super
super代表父类的引用,用于访问父类的属性、方法、构造器
1.基本语法
- 访问父类的属性,但不能访问父类的private属性。
super.属性名; - 访问父类的方法,不能访问父类的private方法。
super.方法名(参数列表): - 访问父类的构造器:只能放在构造器的第一句,只能出现一句!
super(参数列表);
2.细节
- 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
- 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果!
- super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A(本)->B(父)->C(爷)
- super不能在静态上下文中使用。因为super关键字指的是当前对象的父类部分,而静态方法和静态变量是属于类本身的,不依赖于具体的对象实例,所以在静态方法或静态上下文中无法使用super关键字。
- super和this的比较


4万+

被折叠的 条评论
为什么被折叠?



