`

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

    博客分类:
  • 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");
    }
}

 

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

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics