继承中的字段覆盖问题

yo_yo77 2015-04-20 09:27:53

public class PointDemo extends Person{
public int high = 10;
public static void modify(int a){
;
}

public static void main(String[] args) {
Person p1 = new PointDemo();
System.out.println(p1.high);
}
}

class Person{
public int high = 1;
}

此时程序输出结果是:1


public class PointDemo extends Person{
public int high = 10;
public static void modify(int a){
;
}

public static void main(String[] args) {
PointDemo p1 = new PointDemo();
System.out.println(p1.high);
}
}

class Person{
public int high = 1;
}

但此时的输出结果又是:10

这是为什么?
...全文
380 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wengjing1202 2015-04-30
  • 打赏
  • 举报
回复
三仙半 2015-04-28
  • 打赏
  • 举报
回复
引用 6 楼 bbjiabcd 的回复:
字段覆盖和方法重写是两码事,重写的情况会根据实例判断,父类的引用放入子类的实例,那么会调用子类重写的方法,而字段并不存在重写这个概念,因此仅会根据引用的类型去取字段的值,因此会取父类的字段值。
学习了。。。
bbjiabcd 2015-04-28
  • 打赏
  • 举报
回复
字段覆盖和方法重写是两码事,重写的情况会根据实例判断,父类的引用放入子类的实例,那么会调用子类重写的方法,而字段并不存在重写这个概念,因此仅会根据引用的类型去取字段的值,因此会取父类的字段值。
finemi 2015-04-23
  • 打赏
  • 举报
回复
属性不会覆盖,父类和子类可以存在同名的属性,那么如何调用? 子类直接调用属性那就是子类里面这个属性,调用父类的该属性则super.属性 这也算是super的一个用处吧。 那么你通过父类或者子类对象调用同名属性是一个道理
飏飏一蝶 2015-04-21
  • 打赏
  • 举报
回复
field又不能多态,要想多态可以通过多态的get方法间接实现
scott_129 2015-04-21
  • 打赏
  • 举报
回复
基本类型的属性值域在栈内存中,不在堆内存中,所以不是跟实际创建的对象跑的, 也就是说,跟你的对象引用值是放在同一个栈内存中,所以用引用是直接可以取到的。 确实研究这个意义不大,最多可以加深理解java的内存模型。
yo_yo77 2015-04-21
  • 打赏
  • 举报
回复
不管如何,感谢大家的回答!
rumlee 2015-04-20
  • 打赏
  • 举报
回复
研究这个真的意义不大,在实际项目设计中,如果在继承的时候存在对属性进行覆盖的话,那应该是设计的有问题。 反正我做java这么多年以来还从来没有在实际项目中对基类属性进行覆盖过。

62,614

社区成员

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

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