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