class A {
        public A() {
         init();
        }
        
        public void init() {
        
        }
}
public class B extends A {
        int i;
        int s=1;
        
        public void init(){
                i = 100;
                s = 100;
        }
        
        public void println() {
                System.out.println(i);
                System.out.println(s);
        }
        
        public static void main(String[] arg) {
                new B().println();
        }
}
执行结果是:
           100
           1

解决方案 »

  1.   

    class A {
            public A() {
             init();
            }
            
            public void init() {
            
            }
    }
    public class B extends A {
            int i;
            int s=1;
            
            public void init(){
                    i = 100;
                    s = 100;
            }
            
            public void println() {
                    System.out.println(i);
                    System.out.println(s);
            }
            
            public static void main(String[] arg) {
                    new B().println();
            }
    }
      

  2.   

    = =!
    先public A() s和i得到100;
    然后,s再赋值为1
      

  3.   

        楼上已经给答案了,我这里只是再解释一下:
    class A {
    public A() {
    init();
    } public void init() {
    System.out.println("AAAAAAAAAAA");
    }
    }public class B extends A {
    int i;
    int s = 1; public void init() {
    i = 100;
    s = 100;
    System.out.println("BBBBBBBBBBBB");
    } public void println() {
    System.out.println(i);
    System.out.println(s);
    } public static void main(String[] arg) {
    new B().println();
    }
    }我想你运行一下上面这个程序,可能会更明白一点。 B类因为继承了A类,并且重写了A类的一个方法。所以B类在运行时,会先调用A类的构造函数。A类的构造函数中调用Int()方法,这个方法被B数重写,它不会调用自己类里面的哪个Int(),而是调用B中的Int,这样就行到I=100,B类在初始化时没有指定构造函数,它会用默认的构造函数,并且初始化全局变量,因为I没有指定值,但在A类调用时给了一个值,所以JVM 不会再给它指定值。这大概就是你所得结果的原因,如果有胡说的地方请大家指证
      

  4.   

    父类中构造 
    子类中 init
    子类中  println
    执行过程
    但是为什么呢
      

  5.   

    int i;
    int s=1;
    等价于
    int i;
    int s;
    {s=1;}   顺序
        父类动态块: 无
        父类构造函数: 调被override过的init()  
        子类动态块:{ s=1; }
        子类构造函数: 无
        
        明白了吧
      

  6.   

    先调用A的构造函数时,执行init方法,B方法覆盖了init方法改变了i,s值.然后再初始化B的属性s=1
      

  7.   

    应该是在先执行public void init()
    {
    i=100;
    s=100;
    }
    把i,s均赋值,再执行int i,s=1。