java的三大要义,封装,继承和多态。
继承中最近我发现了一个有意思的问题。
继承中我能不能用this引用父类的变量?
答案是可以的。
public class TTT {
public static void main(String[] args) {
int i=0;
new Show1().shows(1);
new Show2().shows2(1);
}
}
class Show1{
int i=0;
public void shows(int i){
i++;
this.i++;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
}
}
class Show2 extends Show1{
public void shows2(int i){
this.i=100222;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
}
}
那么问题来了?
如果我又用super引用同一个变量会怎么样?
他们是相同还是同一个东西?
结果是改变其中之一另一个也贵随着改变
public class TTT {
public static void main(String[] args) {
int i=0;
new Show1().shows(1);
new Show2().shows2(1);
}
}
class Show1{
int i=0;
public void shows(int i){
i++;
this.i++;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
}
}
class Show2 extends Show1{
public void shows2(int i){
i++;
this.i=100222;
i=1000;
super.i=1000;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
System.out.println("show1"+super.i);
}
}
那么如果我再在子类中从新定义一个同名变量的话
public class TTT {
public static void main(String[] args) {
int i=0;
new Show1().shows(1);
new Show2().shows2(1);
}
}
class Show1{
int i=0;
public void shows(int i){
i++;
this.i++;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
}
}
class Show2 extends Show1{
int i=0;
public void shows2(int i){
i++;
this.i=100222;
i=1000;
super.i=1000;
System.out.println("show1"+i);
System.out.println("show1"+this.i);
System.out.println("show1"+super.i);
}
}
结果不一样了,this.i和super.i不在相同并且改变另一个也不会改变另一个。
其实从内存角度出发的话会发现很简单。
因为子类创建一个和父类参数同名的参数是父类会保留自己的内存,同时给子类一个属于自己的内存,所以导致了这个现象