请问一道题,是关于静态方法的,请看题目

yjjbmk 2004-10-02 09:29:44
1.class A
2.{
3. public static void a(){
4. System.out.println("super's a()");
5. }
6.};
7.public class Child extends A
8.{
9. public static void a(){
10. System.out.println("child's a()");
11. }
12. public static void main(String[]args){
13. A ch=new Child();
14. System.out.println(ch);
15. ch.a();
16. }
17.};

我在运行后得到结果为:Ch@12498b5
super's a()
请问,这是为什么???
我知道,第13句,编译时ch为父类A的引用,而运行时是子类Child的引用。所以执行到14句时输出了子类的对象;可为什么到15句时,ch.a()调用的时父类中的方法呢??不是ch在执行到14句时已经是子类的引用了吗???请高人指点!!!
...全文
120 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
skyxj 2004-11-10
  • 打赏
  • 举报
回复
静态方法实现的早期绑定,对象调用方法是晚期绑定
pythonjyc 2004-10-07
  • 打赏
  • 举报
回复
就是覆写 编译器也是先加载父类方法 如果子类覆写 则在加载子类方法
静态方法确实不能覆写 两个是独立的存储空间
FGhost33 2004-10-07
  • 打赏
  • 举报
回复
yjjbmk(天涯浪人)说的有理。
不能覆盖static方法!因此上述方法不是方法覆盖!
yjjbmk 2004-10-06
  • 打赏
  • 举报
回复

在SUN-275教材7-7内写有:不能覆盖static方法!因此上述方法不是方法覆盖!
黑马 2004-10-04
  • 打赏
  • 举报
回复
我觉得serf() 说的有道理!
yjjbmk 2004-10-04
  • 打赏
  • 举报
回复
可不可以这样认为:
因为在编译时,首先执行静态定义初始化,按照先父类后子类的顺序。这里的父类和子类的方法因为都是static的,所以在编译时首先加载,即早绑定。
第13行,对象ch在编译时是父类A的,而在运行时是属于子类Child的,所以第14行输出子类的,而在第15行,因为ch在编译时是父类的,a方法也是在编译时加载的,所以此时应该执行父类的a方法!
MaoZhua 2004-10-04
  • 打赏
  • 举报
回复
这个问题我开始也不知道,不过重运行结果看:静态方法不支持多态,“静态”吗,从名字上也可以看出他并不会随着运行而放生什么改变。静态方法是属于类的,他只看调用他的是什么类。
鄙人的一点看法。仅供参考!
unrealwalker 2004-10-04
  • 打赏
  • 举报
回复
我感觉yjjbmk(天涯浪人) 说得不太对,并不是首先加载的问题,关键是ch的引用类形是A
efpsy 2004-10-03
  • 打赏
  • 举报
回复
我记得好象是动态方法的调用与对象的类型有关而与它所引用的类型无关.
lovelymaomao 2004-10-02
  • 打赏
  • 举报
回复
虽然他的引用是子类的。。。但是已经向上转型为父类了,运行期调用的方法都是父类的~
如果改为(Child)ch.a(); 就可以输出"child's a()" 了~
serf 2004-10-02
  • 打赏
  • 举报
回复
静态方法,不支持虚拟多态,因此是根据编译时决定的。A ch;ch的类型是A类的引用,所以调用其静态方法。
相关推荐
发帖
Java

4.9w+

社区成员

Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
帖子事件
创建了帖子
2004-10-02 09:29
社区公告
暂无公告