class Animal {

private int i =0;

public Animal(){
 System.out.println("animal is running!");
 
}
public Animal(int a){
this();
System.out.println("an animal ia running!");
}
public void eat(){
System.out.println("eat meat !");
}
}
public class Dog extends Animal{
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
}
public Dog(){
super(8);
System.out.println("dog is running!");
}
public void eat(){
super.eat();
System.out.println("eat bone!");
}
}为什么运行结果是:
animal is running!
an animal ia running!
dog is running!
eat meat !
eat bone!我的预期结果是:
animal is running! 
animal is running! 
an animal ia running! 
dog is running! 
eat meat ! 
eat bone! 思路:main开始执行-->执行new Dog()-->Dog有父类执行父类无参构造,打印出animal is running!(父类构造器执行完毕)-->执行子类构造器-->调用父类有参构造器-->调用父类无参构造器,打印animal is running!-->父类有参构造器,打印an animal ia running!-->子类构造器打印dog is running!(子类构造器执行完毕)-->执行dog.eat()-->子类自身有eat方法,执行Dog类的eat方法-->调用父类的eat方法,打印eat meat !-->打印eat bone!(Dog类eat方法执行完毕)

解决方案 »

  1.   

    因为你用了super(8);就会直接指定用哪个
      

  2.   

    main开始执行-->执行new Dog()-->Dog有父类执行父类无参构造,打印出animal is running!(父类构造器执行完毕)-->执行子类构造器-->调用父类有参构造器-->调用父类无参构造器,打印animal is running!-->父类有参构造器,打印an animal ia running!-->子类构造器打印dog is running!(子类构造器执行完毕)-->执行dog.eat()-->子类自身有eat方法,执行Dog类的eat方法-->调用父类的eat方法,打印eat meat !-->打印eat bone!(Dog类eat方法执行完毕)
      

  3.   

    额... 你没细看把? new Dog()会调用一次父类的无参构造吧,this()也会调用一次父类的无参构造吧,但是从打印输出的结果看,父类构造方法只被调用一次,因为只输出了一个animal is running!
    明白??论坛大牛这么多 这个问题没人知道??????????
      

  4.   

    new Dog()会调用Dog类的无参构造器,如果该类有父类(Dog无参构造器没有用到super关键字),就会默认调用父类的无参构造器,相当于super();,如果有指定了,就去父类指定的构造器去构建,然后继续往下
      

  5.   

    这个只是一个地方,那接下来的代码中执行了这句:this() 他也是调用本类的无参构造的按你说的,继续往下,为何没有第二次输出animal is running!