面向对象基础知识,请指点

bineon 2005-10-08 10:03:16
编写如下代码

public class A {
public String getValue() {
return getRealValue();
}
private String getRealValue() {
return "a";
}
}

public class AA extends A {
protected String getRealValue() {
return "aa";
}
}

使用代码测试:
A a = new AA();
System.out.println(a.getValue());
得到输出 “a”

如果把A类中的private方法getRealValue修改为protected,那就得到“aa”。为什么呀?
-----------------
在core java中看到说类似于A a = new AA(); 这样的语句,虽然a为A类型,但a指向的存储空间所保存的数据仍然是AA类型的。那这样来说应该不管是private的getRealValue还是protected,都应该得到aa呀!
...全文
302 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
prok 2005-10-09
  • 打赏
  • 举报
回复
私有方法不能被复写
zydgyy 2005-10-09
  • 打赏
  • 举报
回复
你可以在子类中提升方法的访问权限,不能降低访问权限
lyj830223 2005-10-09
  • 打赏
  • 举报
回复
在继承里,子类的修饰符要比父类的严格。
A a = new AA(); 用子类创建父类,只有子类继承的变量和方法或改写父类的方法可用,而你的子类没有改写父类的方法,而是重新定义了一个新的方法了

zxbjlu1983 2005-10-09
  • 打赏
  • 举报
回复
派生类AA不能override(覆盖)基类A的私有成员方法,既然没有覆盖所以也就谈不上如core java中所指的动态绑定了。
如果把A类中的private方法getRealValue修改为protected那么AA继承了getRealvalue()就可以覆盖它了。
OnlyFor_love 2005-10-09
  • 打赏
  • 举报
回复
私有私有,就是只有自己拥有,别人休想看到
yantao688 2005-10-09
  • 打赏
  • 举报
回复
私有的方法只有本类中成员可以看的到啊。。出了着个类就看不到了,但C++里面就有个友员又不同了,。
mingjianzeng2003 2005-10-09
  • 打赏
  • 举报
回复
私人的东西别人怎么可能用呢,
shine333 2005-10-09
  • 打赏
  • 举报
回复
这个无法override的,我在JBuilder2006里面将A中的private擦掉,变成package(或其他更高的)级别,AA中的getRealValue()方法就立刻变成了斜体(override method)。

上面说的是废话。

private methods之所以无法override还有一个原因,那就是在某些情况下,编译器会将private方法编译为内联函数(inline),而内联函数是永远不可能实现多态的
yanxiazhiqiu 2005-10-09
  • 打赏
  • 举报
回复

说那么多没用的
schumi35 2005-10-09
  • 打赏
  • 举报
回复
a指向的存储空间所保存的数据确实仍然是AA类型,但调用的getValue()方法是其父类的.在a对象里并没有getValue()方法,即没有重写getValue()方法.而同时父类的getRealValue()是private的,不能被子类重写.
所以过程大致如下:
A a = new AA();
System.out.println(a.getValue());
a 在执行getValue()方法时会先向上转行成A类型,执行A类型的getValue().而A类型中的getRealValue()方法是是private的,故而在调用的时候不会动态绑定到AA类型的getRealValue(),所以还是调用A类型的getRealValue()方法.
interhanchi 2005-10-09
  • 打赏
  • 举报
回复
私有方法的话,除了自己没人看得到!
逍遥小飞狼 2005-10-08
  • 打赏
  • 举报
回复
在用子类初始化父类对象的时候,对象只能访问父类的属性和方法。当父类的方法为protected的时候,调用时会自动转想子类的同名方法。
wcj1981 2005-10-08
  • 打赏
  • 举报
回复
在面向对象中你忽略了一个问题,那就是在继承的时候,父类的修饰符不能比子类更严格,这样子子类没有办法继承下去了。

你说的private String getRealValue(),他是父类的方法,那么子类不可能用protected覆盖它了,直接继承下来,所以调用是父类的,当你把它改成protected的时候,就可以覆盖了。

你把父类和子类中的方法修饰符换一下试试。
believefym 2005-10-08
  • 打赏
  • 举报
回复
父类的方法是private的话,子类就没有覆盖,
如果不是private的话,调用的时候就动态绑定,调用子类自己的方法,就得到了楼主的结果
mascotzhuang 2005-10-08
  • 打赏
  • 举报
回复
详参think in java
holy_phoenix 2005-10-08
  • 打赏
  • 举报
回复
子类不能继承父类的私有方法,也就不能覆盖父类的同名私有方法。

62,614

社区成员

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

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