`

为什么有必要给父类提供默认的构造函数

    博客分类:
  • Java
 
阅读更多

我们知道在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");
    }
}

 

就是说无论子类定义默认构造器还是含参构造器,都需要显式调用父类的含参构造器,以保证父类的初始化。

 

 

-------------------

分享到:
评论

相关推荐

    构造函数借鉴.pdf

    6. 示例分析:在提供的示例中,当`base`类有两个构造函数(一个无参,一个带int参数),`derived`类也有两个对应的构造函数时,子类的构造函数会默认调用父类的无参构造函数。如果注释掉父类的无参构造函数,子类的...

    php构造函数的继承方法

    在第一种情况中,如果子类没有定义自己的构造函数,那么它将会默认继承父类的构造函数。这意味着当创建子类对象时,父类的构造函数会自动执行。例如: ```php class A { public $name; function __construct() { ...

    java练习册(011)--类(3).pdf

    如果类中没有包含任何构造函数,Java运行时系统会自动提供一个默认构造函数。然而,如果我们想在创建对象时进行特定的初始化,我们应当手动编写构造函数。这可能包括设置成员变量的初始值、执行一些必要的配置或其他...

    题目:显示宠物信息(Dev C++运行可通过但是会警告)(纯虚函数、父类指针、动态多态性、继承)

    在`Pet`类中,我们有两个构造函数,一个是默认构造函数,另一个是拷贝构造函数。派生类`Cat`和`Dog`也定义了自己的构造函数,用于传递必要的初始化信息。 6. **重载函数**: `GetInfo()`和`Speak()`在`Cat`和`Dog`...

    Swift-init构造函数

    在Swift中,构造函数(也称为初始化器)负责设置新实例的初始状态,并确保所有必要的属性都被赋予了适当的值。理解并熟练掌握Swift的构造函数对于编写健壮且可维护的代码至关重要。 一、初始化器的类型 1. 默认...

    【独家】【笔面试知识要点】16.OOP与OBP构造函数静态块1

    默认构造函数是由Java编译器自动提供的,当用户没有定义任何构造函数时,编译器会提供一个无参的构造函数,以便进行基本的实例化。 构造函数不能被声明为final,因为final关键字在Java中用于表示不可改变或不可重写...

    2019-2020第二学期计算机学院《JAVA程序设计》考题(A卷) -最终版1

    ` 是正确的,因为它先设置了默认的利息率,然后调用父类BankAccount的缺省构造函数。 - ② `super(); myInterestRate = 0;` 也是正确的,因为先调用父类的构造函数,然后设置利息率。这与①只是顺序不同,但结果...

    php构造函数实例讲解

    默认情况下,子类的构造函数不会自动调用父类的构造函数。若想在子类的构造函数中执行父类的构造函数,我们需要通过`parent::__construct();`来显式调用,就像注释掉的那行代码所示。 如果`b`类没有定义自己的构造...

    PHP中构造函数和析构函数解析

    需要注意的是,如果子类没有定义构造函数,它会默认继承父类的构造函数(如果父类的构造函数不是`private`的)。但如果子类定义了自己的构造函数,那么父类的构造函数不会自动调用,需要显式调用。 接下来,我们来...

    C++对象模型-322

    使用成员初始化列表比在构造函数体内赋值更有效,因为它可以避免多次调用默认构造函数或拷贝构造函数,并且对于`const`成员和引用成员,必须在初始化列表中初始化。 ### 第 3 章:Data 语意学 #### 3.1 Data ...

    安卓学习内部总结

    在JAVA中,子类的构造函数默认会调用父类的无参构造函数,如果父类没有无参构造函数,需要显式地调用父类的其他构造函数。 3. 多态性允许父类引用指向子类实例,增强了代码的扩展性。然而,这也意味着父类引用无法...

    C++面试题

    类的构造函数和析构函数是类的重要组成部分,其中构造函数包括默认构造函数、拷贝构造函数、析构函数和赋值函数。拷贝构造函数在对象复制、函数参数传递和函数返回值时被调用。 构造函数和普通函数在形式上的区别...

    C#封装与继承笔记大全

    一旦定义了一个构造函数,编译器将不再提供默认构造函数。 **示例代码** ```csharp public class Person { private string Name; private int Age; // 默认构造函数 public Person() { this.Name = "Unknown...

    c++深入详解视频勘误和说明

    值得注意的是,如果一个类没有用户自定义的构造函数,C++编译器并不总是提供默认构造函数。编译器仅在特定条件下生成默认构造函数:1) 类包含虚拟成员函数或具有虚拟继承的父类(即虚拟基类);2) 类的基类有构造...

    C++复习笔记简单整理

    - 当类中定义了自己的构造函数时,默认构造函数会被隐式删除。 - 类似地,当定义了拷贝构造函数或赋值运算符时,相应的默认函数也会被隐式删除。 ##### 4. 对象实例化: 创建对象的过程称为实例化。可以通过调用类...

    java面向对象知识点总结[参考].pdf

    构造函数是用来给对象进行初始化的,初始化就是指给对象的各个属性赋值。构造函数的作用是用来给对象进行初始话的。构造函数的语法是 `修饰符 类名 (参数列表) { 具体执行的代码 }`。如果我们没有明确指定构造函数,...

    C++期末复习(选择、判断与填空).pdf

    则默认的访问权限是(D)A、publicB、privateC、protectedD、无特定权限26、在C++中,关于构造函数的描述正确的是(B)A、构造函数不可以重载B、构造函数可以重载C、构造函数必须由用户定义D、构造函数必须有返回值27、...

    C/C++经典面试题

    7. 缺省函数:C++编译器会自动生成四种缺省函数:默认构造函数、拷贝构造函数、析构函数和赋值函数,以处理对象的基本生命周期和操作。 8. 拷贝构造函数的调用时机:拷贝构造函数在创建新对象时复制已有对象时被...

Global site tag (gtag.js) - Google Analytics