java重写 父子类成员变量分配两个内存还是指向相同内存

子类重写父类的成员变量和方法是重新分配内存?还是也指向父类的内存?

写一个父类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是调用不到的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值