“父类若没不带参数的构造器,子类构造器必须显式调用超类其他的构造器”为什么

“父类若没有不带参数的构造器,子类构造器必须显式调用超类其他的构造器”为什么?
为什么必须这样?能举个例子吗“父类若没不带参数的构造器,子类构造器必须显式调用超类其他的构造器”为什么
------解决思路----------------------
其实目前的这些主流的面相对象的语言  都是这么要求的  也就是你构造子类的时候  必须要构造父类对象  
你想想 因为你子类 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构造器。以达到来初始化父类的目的。可以这样理解吗?