构造方法中的this

    当子类继承父类时,子类会获得父类中定义的成员变量和方法。在权限允许的情况下,子类可以直接访问父类的成员变量和方法。笼统的说是这样的,但是Java中对继承成员变量和方法的处理是不同的。

//父类

public class Base {
private int i = 2;


public Base() {
this.display();
}


public void display() {
System.out.println("输出i:" + i);
}

}

//子类

public class Dervied extends Base {
private int i = 22;


public Dervied() {
this.i = 222;
}


public void display() {
System.out.println(i);
}


public static void main(String[] args) {
new Dervied();


}

}

此时的输出结果是多少呢? 22 还是 222 还是 其他什么?  答案( 0 )

分析:  我们在main方法中new了一个Dervied对象。JVM会为该对象分配内存空间。由于子类继承父类,所以在该对象中会存在2个实例变量i (默认值为0)。

然后会调用对应的无参构造方法。 我们知道,对象初始化过程如下:

    1.调用父类的非静态代码块(如果有的话,此处没有) 

    2.调用父类的构造方法。

    3.调用子类的非静态代码块(如果有的话,此处没有)

    4.调用子类的构造方法。

通过上述初始化过程我们此处可以得知, 

      1。先给该对象的所有成员变量分配内存空间(每个成员变量都有默认值  0 |false |null .。。。)

    2.调用父类的构造方法(此处为无参构造方法)

    3.由于在父类中调用了this.display()。 (此处的this 是指什么?)

                结论(在构造方法中的this指的是:this所在的构造方法的变量  ) 

                由于是调用子类的构造方法导致的父类的构造方法被调用,所以此处的this指的是Derived的实例变量(!!!)

    4.由于this指向的是子类的实例变量,所以调用的display方法也是被子类重写过的方法

       由于此刻子类中的i变量值还没有被初始化,所以子类的display输出结果是  0  而不是22 或222


如果在父类构造方法中加入一句话 system.out.println(this.getClass());

输出结果应该为什么呢 ?

答案是: class extend.Dervied  

由此可见上述分析是正确的

    参考资料:疯狂Java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值