super和this

this

this代表对象本身的关键字
this.属性名:表示当前对象的属性
this.方法名(参数):表示调用当前对象的方法
指代的是对象的内存地址 ,是对类的当前实例的引用

this( ) 用来访问本类的构造方法

  1. 不能在普通方法中使用,只能写在构造方法中
  2. 不出现在static修饰的语句中

super

super是指代父类的关键字
super.父类属性名:调用父类中的属性
super.父类方法名:调用父类中的方法
不指代对象的内存地址,而是指代父类的特征(构造方法、普通方法和属性。)

super()代指父类中的无参构造
super(a)代指有参构造

  1. 如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。(即默认为 super(),一般这行代码省略了)
  2. 需要注意的是它只能出现在该类中的第一行
  3. 不出现在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的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值