Java this与super的仇与恨
刚开始学习面向对象的时候,看到this和super觉得this就是指当前对象,super指最近的父级对象。觉得用处不大。
后来,随着学习的深入,看别人的代码越来越多,发现this和super的使用率贼高~,就决定深入的了解一下这俩兄弟。
既然设计到继承和对象,我们就可以从JVM的堆栈的角度去分析。
首先,当我们创建一个子类的时候,在堆中的子类对象一定包含着其继承的父类对象。如果子类和父类都包含名字为value的成员变量。我们可以用this和super来进行操作。
老规矩,show you my code。代码中参悟。
父类:
public class Father {
int value;
public void val() {
value = 10;
System.out.println("Father'value is" + value);
}
}
子类:
public class Child extends Father {
int value;
public void dirValue() {
value = 20;
System.out.println("Child'value is " + value);
// 这时候应该为0
System.out.println("子类中没有调用super的Father" + super.value);
super.val();
// 这个时候应该为10
System.out.println("子类中调用super之后的Father" + super.value);
System.out.println("Child'value is" + value);
}
}
客户端:
public class Client {
public static void main(String[] args) {
Child child = new Child();
child.dirValue();
}
}
输出结果:
分析:
当客户端创建子类的时,堆栈中的存储结构是这样的~
执行new child实例的时候:
栈 堆
child ——》 Child对象(包含Father对象)
Child本身包含一个value的成员变量
Child中的Father对象也含有一个value的成员变量
当程序执行到child.dirValue()的时候:
先给value成员变量赋值,这个时候是给自己对象中的value赋值。
super.value,这个是指向这个child中Father对象的value,因为没有给其赋值,编译器会自动给其初始化为0。
调用Father的中的方法,方法打印还有给Father对象value赋值。
最后为了检验对父类的操作没有影响到子类的value值。
总结:
this:
this是指向当前的对象,其本质就是一个指针了。
this可以用于当成员变量的名称和参数相冲突的时候用this.成员变量来指定。
this可以用于构造函数之中,用来引用其他的构造函数。(必须是第一行)
super:
super是指向当前对象里的父类的对象。(super在Java中是个关键词)
子类构造方法用了super指的是调用父类中的构造方法。