看到一本书上写着,当子类不带有构造函数的时候,系统会自动给子类加入一个构造函数,并且在该函数中执行父类的无参构造函数。但假如我在子类中自己定义了一个构造函数,并且让该子类的构造函数不执行父类的无参构造函数。但是运行一遍程序,父类的构造函数还是被执行了啊?
测试程序如下:
父类:
public class ancester{
//父类的无参构造函数,继承的子类被实例化的时候这个无参构造函数总会被调用。
public ancester(){
System.out.println("ancester");
}
}
子类:
public class child extends ancester{
public child(){}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
------------------当父类不变,子类改成这样的时候:
public class child extends ancester{
public child(){
System.out.println("aaaa");
}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
aaaa
-------------------
难道说明了子类不管有啥构造函数,都是必须执行一次父类的构造函数?有没有啥技巧方法能避免将子类实例化的时候调用父类的无参构造函数?

不知道我说明白没有……

解决方案 »

  1.   

    你把父类的构造函数设置成有参的构造函数就不会被调用了··无参构造函数是你写子类的时候使用extends关键字就会自动调用父类的无参构造函数了··想不调用它的话除非你不继承于它··因为Java的规定是··要构造一个字类的对象之前必须构造一个父类对象··这就是说·现有父亲才能有儿子··不知道你明白不··
      

  2.   

    楼上说的蛮明白了。我简单点的说。父类没有无参的构造方法,而有有参数的构造方法,那么子类继承的时候,就不能自定义无参的构造方法了。反之,父类有无参构造方法,子类若定义了的无参构造方法,在这个无参数的构造方法里是等于默认第一行super()。
      另:你想不调用,这是不可能的。JAVA的虚拟机决定了的事情,除非你能把这东西给改了。
      

  3.   

    不管怎么样,子类都都会调用父类中的一个构造构造函数,但是子类可以选择调用父类中的哪一个构造,默认情况下在子类中的构造方法中存在一个super();来调用父类的无参构造方法,有要调用一个参数的算就可以用super(参数);,两个就super(参数,参数);
      

  4.   

    你可以在调用子类的无参构造函数中用super(填传入的值)调用父类有参的构造函数!!!