子类重写父类的成员变量和方法是重新分配内存?还是也指向父类的内存?
写一个父类Father和子类Son,重写父类成员变量和方法
class Father
{
public int a;
public int b;
public Father(int a, int b){
this.a = a;
this.b = b;
}
public Father(){
}
public void fun(){
System.out.println("父类方法");
}
}
class Son extends Father
{
public int a;
public Son (int a, int b, int c){
super(a, b);
this.a = c;
}
public void fun(){
System.out.println("子类方法");
}
public void show()
{
System.out.println("这个是子类重写成员变量a = " + this.a);
System.out.println("这个是父类的成员变量a = " + super.a);
this.fun();
super.fun();
}
}
其中子类添加方法show,调用this.a和super.a this.fun()和super.fun()
结果如下,是完全不同的父子类变量和方法
这个是子类重写成员变量a = 3
这个是父类的成员变量a = 1
子类方法
父类方法
说明子类重写的内容在堆中开辟了新的空间
另外当父类用private限制访问范围时候,子类的同名成员变量/方法不构成重写,此时父子类的成员是不相干的两个同名成员
之前写的内容说明父类成员变量和子类成员变量是存储在不同的内存空间的,变量并非简单的重写关系,而是子类隐藏掉父类成员变量的关系,以下为新的总结
当调用一个成员变量的时候,没有显式指定程序的调用者,则程序按照以下顺序寻找变量:
1.该方法中是否定义了该局部变量
2.当前类中是否定义了该成员变量
3.直接父类是否定义了该成员变量,直到找到Object都没有,程序就会报编译错误
外部调用子类变量:成员变量也能被继承,无论类,实例变量,只要是同名定义,都可以改变类型(类型被更新),改变访问修饰符(子类访问修饰符会更新变量访问状态),甚至类和实例互相改变(子类static或者非static会更新属性状态),所以其本质上并不是重写,只是由于以上3条做到的隐藏。基本可以理解为子类对父类是降维打击式的隐藏,只要同名,就会影响父类属性。只要同名,子类优先
内部调用父类变量就可以super(实例变量时候)了,当然父类的private是调用不到的