我们知道在Java里面有这样的规则:
- 如果一个类没有提供默认的构造器,Java编译器就会为该类提供一个默认的无参构造器。
比如class A {} 这样什么都没有的类是合法的,编译器会自动给他一个构造器。
- 在Java继承体系中,父类必须先于子类初始化,所谓有父才有子。
因此子类中必须保证父类能初始化,这样有两种情况:
1)在子类的构造器中显式的调用父类的构造器,
2)如果没有显式调用,子类的任何构造器都会默认调用父类的无参构造器。
考虑这种情况:
class SuperClass {
//父类没有默认构造器,但是有含参构造器
public SuperClass(String param) {
}
}
class ChildClass {
}
回到标题的问题,如果没有给父类一个默认的构造器,上述子类是不能通过编译的。因为:
- 编译器会给子类提供默认的构造器。
- 编译器不会给父类提供默认构造器,因为父类已经定义一个构造器了。
- 子类在实例化时,会调用父类的默认构造器,但是--父类没有,因此逻辑上是有错的。
有几种方法可以让它通过编译。
一种是给父类提供一个空的无参构造器。这也是大家提倡的:继承体系中给父类提供默认的构造器,以免子类编译出错。
另外一种,如果不给父类提供默认的构造器,子类的实现就需要一些额外的限制:它必须保证父类能初始化。因此子类必须提供自己的构造器,并且在构造器中调用父类的构造器。以下两种都是合法的:
class ChildClass {
public ChildClass() {
super("some argument");
}
}
class ChildClass {
public ChildClass(String param) {
super("some argument");
}
}
就是说无论子类定义默认构造器还是含参构造器,都需要显式调用父类的含参构造器,以保证父类的初始化。
-------------------
分享到:
相关推荐
1. 从存储空间角度,虚函数对应一个指向...所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通
构造函数与默认构造函数的声明、定义、应用、比较
C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数
c#默认构造函数的作用
没有合适的默认构造函数,默认构造函数怎么写?为什么这样写?没有写赋值构造函数
在本文里我们给大家分享一篇关于Python 子类继承父类构造函数的相关知识点内容,需要的朋友们跟着学习下。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。 构造原则如下: 1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。 ...
子类如果有多个构造函数的时候,父类要么没有构造函数, 让编译器自动产生,那么在执行子类构造函数之前先执行编 译器自动产生的父类的缺省构造函数;要么至少要有一个显 式的缺省构造函数可以让子类的构造函数调用...
创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数...
如果用户没有提供构造函数和析构函数,系统将提供默认的构造函数和析构函数。 1.构造函数 构造函数是一个与类同名的方法,可以没有参数,有一个参数或多个参数,但是构造函数没有返回值。如果构造函数没有参数,该...
已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用。 显式默认设置的函数和已删除函数的好处 在 C++ 中...
编译器添加的默认构造函数的条件: 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做(这只是一种情况而言,此构造函数是trival 派生类和基类的关系: 我们...
构建一个类Point,它提供两个公有的构造函数,一个没有参数的Point构造函数和一个有两个double参数的构造函数。另外在该类中提供一个静态方法计算两个点的直线距离,传入参数为两个Point类实例。然后设计一个测试类...
造其实是可有可无的,所以不妨说编译器其实是为每个类生成了默认构造函数的。 在深度探索C++对象模型中讲了四种关于编译器自动生成默认构造函数的情况,在这四种情况下生成的默认构 造函数里面是由实质的隐含代码...
详细介绍了构造函数、复制构造函数、拷贝构造函数之间的区别
调用父类构造函数,对应文件:ClassElement2,文章:https://blog.csdn.net/yysyangyangyangshan/article/details/84311848
主要介绍了C++类继承之子类调用父类的构造函数的实例详解的相关资料,希望通过本文大家能够掌握C++类继承的相关知识,需要的朋友可以参考下
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication6 { public class employee { #region ...