“父类若没有不带参数的构造器,子类构造器必须显式调用超类其他的构造器”为什么?
为什么必须这样?能举个例子吗
------解决思路---------------------- 其实目前的这些主流的面相对象的语言 都是这么要求的 也就是你构造子类的时候 必须要构造父类对象
你想想 因为你子类 is a 父类,也就是说你子类拥有父类的一切属性,但你子类初始化的时候,你只知道你自己的属性,你父类继承过来的field肯定由父类的构造函数去初始化是最合适的了
C++ python构造子对象时 也是这么要求的
引用: Quote: 引用: 首先,问你,子类继承父类是不是就可以拥有父类的属性了,既然可以访问到父类的属性,那说明,在你new 子类的时候,相应的父类的属性也就拿到了,那就是说,父类也被new了一个对象出来,不然你怎么用你new出来的子类对象去访问父类属性,所以。。。引用: 首先,正如以上各位仁兄所说,子类构造器会默认调用 父类的无参构造器,如果父类没有无参构造器,则需在子类构造器的第一行显式地调用父类的其他构造器。 其次,从继承的思想来看,你继承一个类,就相当于扩展一个类,形成一个更为特殊的类,但经常,我们需要将子类向上转型为基类,以便使用或达到其他各种目的。 这时,如果你生成子类对象时没有调用父类的构造器,那么,我们在使用父类的一些成员变量的时候,就会报变量未初始化的错误。请记住,变量初始化总是在构造器调用之前完成! 引用: 先有父类才有子类 new出子类的实例 时执行的构造方法会默认调用父类的不带参数的构造方法 引用: 没有为什么,设计就是这样。 默认情况下,如果没有显式调用父类构造器,则调用默认的那一个。而如果你父类已经实现了其他构造器了,则不存在默认构造器了,所以就没法调用默认的了。 引用: 必须这样的 例子 class Base{ Base(){ System.out.println("Base with no arg"); } } class Test extends Base{ Test(int v){ } public static void main(String[] args) { Test a = new Test(3); } } 输出 Base with no arg 这里子类里面没有显式调用父类的构造函数,但是父类的构造还是被调用了,说明Java加载类的时候,会加载父类的无参数的构造函数 class Base{ Base(int val){ System.out.println("Base int"); } } class Test extends Base{ Test(int v){ //如果这里不调用super(v) 是无法通过编译的 } public static void main(String[] args) { Test a = new Test(3); } } 引用: 首先,子类一定要调用超类的构造器。如果没有显示调用超类的构造器,那么子类构造器就会默认调用超类的无参构造器,如果超类没有无参构造器,那么编辑器就会报错,说: 超类中没有可用的默认构造器. 请看下面的例子: package test; /** 子类一定会调用超类的 构造器 */ public class SuperClassTest { public static void main(String args[]){ B aB = new B(3); } } class A{ // public A(){ // System.out.println("A"); // } public A(String s) { System.out.println(s); } } class B extends A{ public B(int i) { System.out.println("B"); System.out.println(i); } } 错误:There is no constructor available in test.A 从类和对象的观点来看,我是这样理解的,java的机制就是当子类创建时,不管怎么样,必须存在一个构造器来创建出父类,这个super构造器要么是隐式的,如果隐式的没有的话,必须自己调用带参数的super构造器。以达到来初始化父类的目的。可以这样理解吗?