目录
this的原理
哪个对象调用了this所在函数(包含this的函数,this一般都在方法内部调用),那么this就代表哪个对象(这时候在压栈的函数中this会把对象引用所对用的地址值拿过来,跟对象引用名指向堆内存中的具体对象)
this的两个用法
A: 区分成员变量和局部变量
this对象后面跟上.调用的是本类的成员属性和成员方法(一般方法),更多的时候用在成员变量与局部变量重名时
B: 调用本类构造方法
this对象后面跟上()调用的是本类中的对应参数的构造函数。在构造方法的第一行调用,且只能调用一次,少参数的构造方法也可以调用多参数的构造方法,只是多出的参数写死就是了
super的两个用法
A:区分子类成员还是父类成员
当子类与父类中的成员变量或者成员方法重名时,用super来区分是去调用哪一个
B:调用父类的构造函数
super可以在子类构造函数中调用父类的构造函数(至于调用哪一个,要看super里面写的参数),每一个子类的构造函数第一行默认调用的是父类中空参的构造函数
关于this和super的总结
关于this和super,我们可以这样理解,当一个类不存在继承时,他只有this关键字代表一个本类对象的引用(可以说是地址),那么当存在子父类关系时,这时候子类的权利就变大了,他拥有了两个关键字,this与super,他们分别指向子父类的一个引用,所以在子类中调用super.成员变量和方法就相当于调用这个地址指向的变量与方法(可能在内存中的展示不是这样,但是这样理解起来简单),如果在子类构造函数中调用了this指代的其他子类函数,则不会再去调用父类空参的构造方法super(),因为两个调用都要在第一行,相冲突
this跟super调用图解
- 首先将代码加载进方法区,而子的class文件会有一个父的class文件引用
- Main方法开始执行,在堆中创建子类对象,如图所示,父类内容嵌套在子类内容里面
- 执行show方法,分别打印了局部变量,子类num成员变量,父类num成员变量
- 执行子类的method方法,而子类的method方法中盗用了super.method父类方法,这时候父类method方法又进栈,等执行完毕,按照父method,子method,show,main的顺序弹栈