class Super {
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s " + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
System.out.println("s " + s);
}
public static void main(String[] args) {
 new Sub();
}}

解决方案 »

  1.   

    楼上正解,父类的构造函数先于子类执行,所以new Sub()会先调用Super的Super(), 从而执行父类中的abc()
     
      

  2.   

    子类继承父类先执行父类的构造,由于先执行构造所以s尚未被初始化,所以输出为s0.
    改下程序,可以明显看出,父类的方法已经被覆盖。class Super {
        private int s = 100;    Super() {
            abc();
        }    void abc() {
            System.out.println("s1" + s);
        }
    }
    class Sub extends Super {
        private int s = 200;    void abc() {
            System.out.println("s2 " + s);
        }
            public static void main(String[] args) {
             new Sub();
        }
    }
      

  3.   

    s2 0
    运行一边不就得了class Super {
        private int s = 100;    Super() {
            abc();
        }    void abc() {
            System.out.println("s1" + s);
        }
    }
    class Sub extends Super {
        private int s = 200;    void abc() {
            int s=300;
            System.out.println("s2 " + s);
        }
            public static void main(String[] args) {
             new Sub();
        }
    }
      

  4.   

    哦! 我知道了 ,子类中的private 类型变量在父类中访问不到,如下改动就好了!
    class Super {
        public static int s = 100;    Super() {
            abc();
        }    void abc() {
            System.out.println("s1=" + s);
        }
    }class Sub extends Super {
        public static int s = 200;    void abc() {
            System.out.println("s2=" + s);
        }
            public static void main(String[] args) {
             new Sub();
        }}
      

  5.   

       s100
    先调用父类的构造方法输出 s100
    再说,子类的 abc() 它有调用吗??
      

  6.   

    呵呵
    上学期刚刚学完java
    烤得就是这样的这样的程序
    用笔答得,挺有意思的
      

  7.   

    class Super {
        private int s = 100;
        Super() {
         abc();
        }
       void abc() {
            System.out.println("s1" + s);
       }
    }class Sub extends Super  {
    private int s = 200;
        void abc() {
            System.out.println("s2 " + s);
        }
         public static void main(String[] args) {
           Sub s=  new Sub();
    s.abc();
        }
    }运行结果:
    javac Super.java
    java Sub
    s2 0   //此为对象s创建时类Sub初始化继承Super初始化时就输出的值,此时私有变量s没被继承,默0,即Sub中初始化为0,又由于被Sub 的abc()重载故为s2而非s1
    s2200//此为s对象调用Sub.abc()s被重新初始化为200
      

  8.   

    此纯为表面现象迷惑,只要思路明确,写代码良好完全可屏蔽此类错误,。。
    对象初始化先类初始化,类初始化写初始化父类,父类初始化就输出,又被子类方法重载;
    即子类的初始化时变量没有被继承默为0,而方法时构造方法重载的方法
    而new Sub()完全还没有到对象,只是类的初始化
    s.abc()才是你要的结果
      

  9.   

    java为什么要这么干呢?
    就是运行父类的构造函数的时候发现子类重写了父类的构造函数中用到的方法,就调用子类中的方法?
      

  10.   

    17楼的图语焉不详,等于没贴。什么叫调用响应的构造函数,调用子类的构造函数,还是子类的基类的构造函数?
     访问Sub.main()时,编译器就会寻找 Sub.class文件,在装载过程中,装载器发现它有一个基类Super,于是它再装载基类,无论你创建不创建基类对象,这个过程都要发生。下一步,它就会执行基类的static初始化,以此类推。
    现在所有的类都已经装载完毕,可以创建对象了
    首先,对象中所有的primitive都会被设置成它们的缺省值,而reference都会被设置成为null,对象的内存都会被设置成为二进制的零。然后调用基类的构造函数,然后按照各个变量的字面顺序进行初始化,最后会执行子类构造函数的其余部分.
      

  11.   

    class Super {
        private int s = 100;    Super() {
            abc();
        }    void abc() {
            System.out.println("s " + s);
        }
    }
    class Sub extends Super {
        private int s = 200;    void abc() {
            System.out.println("s " + s);
        }
            public static void main(String[] args) {
             new Sub();
        }}运行结果:s0