高手请进,类继承中覆盖和未覆盖的实例变量的奇怪问题

biti509 2007-01-09 04:27:03
同是实例变量,为什么效果不同?

public class Base{
String x = "base-x";//子类不覆盖
String y = "base-y";//子类覆盖
}
public class Sub extends Base
String y = "sub-y";//子类覆盖父类变量x
public Sub(){
System.out.println(super.x+":"+x);
this.x = "sub-x";//或者super.x = "sub-x";
System.out.println(super.x+":"+x);
System.out.println(super.y+":"+y);

}
public static void main(String[] args) {
new Sub();
}
}
最后效果是这样
不管用this还是super改x,父类和子类的x同时改变!
但是y不是这样,父类子类的y改变哪个就变哪个

难道在变量不覆盖的情况下,父类子类共享同一个变量????????????

此外,我知道在new子类的时候,会依次初始化父类显式赋值的实例变量,
父类构造函数,然后是子类的
是不是java后台在new子类的同时也new了一个父类,然后用super引用?
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
trueyellow 2007-01-10
  • 打赏
  • 举报
回复
这不叫覆盖,叫隐藏。
这样做的话,子类中有2个同名变量y,从父类继承下来的那个被隐藏了。
除非显式用super,y都指子类中的那个。

方法中的变量若存在同名,最优先形参,其次this,再次super。
biti509 2007-01-10
  • 打赏
  • 举报
回复
还有没有人详细的解释啊?
ACCPY111 2007-01-09
  • 打赏
  • 举报
回复
我觉得NEW子类的时候只是先初始化了两个String类型的引用变量x和y,分别指向"base-x"和"base-y",后将引用变量y指向到"sub-y",所以不管用this还是super改x,父类和子类的x同时改变!但是y不是这样,父类子类的y改变哪个就变哪个,也就是说父类和子类中的两个引用变量的内存地址是不同的.
z_lping 2007-01-09
  • 打赏
  • 举报
回复
同志们好好读书!
诗海 2007-01-09
  • 打赏
  • 举报
回复
本质上,new出的子类是子类和其父类的一个并集.只不过,子类不能访问父类的私有类变量和成员方法.
z_lping 2007-01-09
  • 打赏
  • 举报
回复
弄清楚类和实例的区别。弄清楚什么是继承。
ttaallkk1 2007-01-09
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧