this
this代表对象本身的关键字
this.属性名
:表示当前对象的属性
this.方法名(参数)
:表示调用当前对象的方法
指代的是对象的内存地址 ,是对类的当前实例的引用
this( )
用来访问本类的构造方法
- 不能在普通方法中使用,只能写在构造方法中
- 不出现在static修饰的语句中
super
super是指代父类的关键字
super.父类属性名
:调用父类中的属性
super.父类方法名
:调用父类中的方法
不指代对象的内存地址,而是指代父类的特征(构造方法、普通方法和属性。)
super()
代指父类中的无参构造
super(a)
代指有参构造
- 如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。(即默认为 super(),一般这行代码省略了)
- 需要注意的是它只能出现在该类中的第一行
- 不出现在static修饰的语句中
class grandPa{
//无参构造
public grandPa(){
System.out.println("1");
}
}
class father extends grandPa{
public father(){
//super()语句不会显示,但实际存在
System.out.println("2.1");
}
public father(String id){
super();//访问父类的无参构造
System.out.println("2.2");
}
}
class Son extends father{
public Son(){
this("coke");//访问本类中有一个String参数的构造方法
System.out.println("3.1");
}
public Son(String id){
this("pepsi","Coca");//访问本类中有两个String参数的构造方法
System.out.println("3.2");
}
public Son(String a,String b){
/*
super();
super(a)也可
*/
super(b);//访问父类中的有一个String参数的构造方法
System.out.println("3.3");
}
}
public class Sequence {
public static void main(String[] args) {
//实例化一个二级子类
new Son();//可以试着估计输出顺序
}
}
/*
运行结果
super() super(a)或super(b)
1 1
2.1 2.2
3.3 3.3
3.2 3.2
2.1 3.1
*/
通过deBug我们可以看到代码在栈中的运行过程:
父类的构造方法先于子类弹栈,并且越高层次的父类越先弹栈
通过画图可以更加清晰的看到grandPa、father、Son中的语句虽然被执行,但他们是没有创建对象的,借此分析引出super和this的作用