java中子类继承父类时是否继承构造方法?
答案是:java中子类是不会继承父类的构造函数但是可以调用
父类 Animal:
package encryption;
public class Animal {
private String name = "animal";
public Animal() {
System.out.println(".....this is Animal.");
}
public Animal(String name) {
this.name = name;
}
public void printName() {
System.out.println(this.getClass().getName() + ":" + this.name);
}
}
子类 Dog:
package encryption;
public class Dog extends Animal {
}
主类 Animal_Test:
package encryption;
public class Animal_Test {
public static void main(String[] args) {
Animal t = new Animal();
Dog t1 = new Dog();
}
}
第一次运行结果:
这时构造方法打印的…this is Animal.
这时构造方法打印的…this is Animal.
修改子类,给子类添加一个显式的无参构造:
package encryption;
public class Dog extends Animal {
//Dog()无参构造方法
public Dog() {
}
}
第二次运行结果:
这时构造方法打印的…this is Animal.
这时构造方法打印的…this is Animal.
再次修改子类,给子类的无参构造添加一个显示父类无参构造调用 super()
package encryption;
public class Dog extends Animal {
//Dog()无参构造方法
public Dog() {
super(); //显式调用父类无参构造方法
}
}
第三次运行结果:
这时构造方法打印的…this is Animal.
这时构造方法打印的…this is Animal.
总结:
从运行结果中可以看出,三次运行的结果都是一致的可以得出以下结论:
1、第一次结果和第二次结果对比,说明当子类没有显式的写出无参构造方法,系统是默认给子类添加一个无参构造方法的;
2、第二次结果和第三次结果对比,说明子类是隐式的在子类无参构造方法中调用super()的,即隐式调用父类无参构造方法的;
3、综合三次结果得出结论,子类不是继承父类的构造方法而是可以隐式的调用父类无参构造方法的;是调用而不是继承;
参考原文:
父类的构造器能不能被子类继承
构造器是无法被继承的,所以不能重写,但是可以重载。
原因:构造器是生产对象的一个途径,假如可以被继承,那么对象就可以被复制了。子类可以通过继承构造器产生父类对象,这样就会出现子类引用指向父类对象,java是不支持向下转型的,只能向上转型。
因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,调用是“自动运行” 继承就是扩展
子类完全没必要扩展父类的构造函数,因为反正每次调子类的时候都会“自动运行”它父类的构造函数,如果真的需要子类构造函数特殊的形式,子类直接修改或重载自己的构造函数就好了。
“调用”一个类有“继承”和“组合(说白了new 一个类)”两种方式,当你“调用”一个类的时候就会“自动运行”它的“构造函数”。
所以父类要么有一个默认的无参数构造,这样Java会自动调用这个无参数的构造。如果父类没有无参数的构造,那么就要你自己在子类的构造中,通过super()的方式调用父类的构造。