package com.neusoft.bbs.oop;
public class SubDynamicStatus extends DynamicStatus{
       
        public SubDynamicStatus() {
                add();
        }
       
        public static void main(String[] args) {
                /**
                 * outputs:
                 * SubDynamicStatus.add()
                 * SubDynamicStatus.add()
                 */
                new SubDynamicStatus();
        }
       
        public void add(){
                System.out.println("SubDynamicStatus.add()");
        }
}class DynamicStatus {
        public DynamicStatus() {
                add();
        }
        public void add(){
                System.out.println("DynamicStatus.add()");
        }}能否讲一下在DynamicStatus中会调用子类的add()方法。

解决方案 »

  1.   

    因为add()这个方法是被子类重写了,所以在父类中调用add的时候会走子类的方法,而不会走父类的add方法
      

  2.   

    结果很意外啊...
    new SubDynamicStatus()->SubDynamicStatus()->DynamicStatus()->SubDynamicStatus.add()
                                              |
                                              |->SubDynamicStatus.add()
    没找到解释
      

  3.   

    创建子类的对象时,首先调用 public SubDynamicStatus() {
                    add();
            }
           调用构造方法,该方法首先调用 super();
    也就是父类的构造方法  public DynamicStatus() {
                    add();
            }
    因为父类中也调用了add(),但现在调用该方法的实际是子类,所以实际调用的是子类的add方法。调用完成返回子类的构造方法,又调用了一次add()记住,不要再构造方法中调用可能被重写的方法,会给程序带来很多问题。
      

  4.   

    想通了,子类对象实例化后内存中只有覆盖后的子类add方法,所以父类只能调用子类add
      

  5.   

    public DynamicStatus() {
                    add();
            }就这一个地方需要说明,此处的add是子类的add别的没啥问题。OVER
      

  6.   

    把 DynamicStatus 的 add 方法改成私有的在 SubDynamicStatus 中就不会调用子类版本的 add 了。
      

  7.   

    我剛試了一下,你錯了,你把兩個add的public改為private試試
      

  8.   

    這個問題到底怎麼理解呢,子類對象生成時,調用父類的構造,正常理解的話,在父類constructor中,this是子類對象,調用的方法應該是子類的方法,但為何若父類被override的方法聲明為private,在父類contructor中的調用的郤是父類方法?
      

  9.   

      public SubDynamicStatus() {
                    add(); //这个地方调用的是子类的方法;
            }
    调用父类的则需要 : super!
      

  10.   

    回去看看什么叫动态绑定 多态
      多态搞懂了,java就差不多了。呵呵
      

  11.   

    输出顺序应该是
    System.out.println("DynamicStatus.add()");
    System.out.println("SubDynamicStatus.add()");
    先会隐式的调用父类的构造方法..等于super();
    但是父类里面的add()方法调用的是子类还是父类还没试。。
    应该是多态性之一吧。
      

  12.   

    只有非final或static方法才有多态的特性~(注:字段同样没多态特性,private隐式地为final)
      

  13.   

    你是要说多态吗?
    声明 DynamicStatus类型,调用子类的add()方法,
      

  14.   

    56k loading.
    能否說說你的見解
      

  15.   

    此处的add为什么是子类的add?!!~
      

  16.   


    因为  private 是私有的  不能被继承  父类中有add()方法 肯定是调用本类中的方法 如果没有 会报错的。