现在的位置: 首页 > 综合 > 正文

通过私有构造函数强化不可实例化的能力

2014年01月10日 ⁄ 综合 ⁄ 共 581字 ⁄ 字号 评论关闭
 

通常的类在没有构造函数的情况下,编译器会自动提供一个公有的、无参数的默认构造函数,因此,在编写类时没有提供构造函数和构造函数私有是不同的。

提供一个私有的构造函数,如果该构造函数不会被类自身所调用,则该类将保证不会被实例化。但是,这么做会使得该类不能被子类化,例如:

class A

{

private A()

{

}

}

 

class B extends A

{

}

不管你是否使用了以上两个中任何一个类,编译该程序都将不会通过,提示:A()A中是private

 

为什么会这样?Java在处理构造函数的时候是这样的:首先编译器先检查是否提供显式的构造函数,如果没有则提供一个我们刚才提到的默认构造函数;其次,如果发现了显式的构造函数,则检查签名是否匹配,如果匹配则调用,如果不匹配则继续寻找,没有则报错。

很简单,Java在实例化一个类的时候,总是先从最超类开始调用构造函数,然后一步步的再调用子类的构造函数,直到调用到我们指定的那个子类。很显然,上面的代码如果在我们定义

B b=new B();

时,编译器会先调用Object的构造函数,然后是A的构造函数--哈!问题出来了,A的构造函数是private,当然就会报出上面的错误。

因此,提供私有化的构造函数是将该类不被实例化的一个很好的途径,但也是将该类不被子类化的最佳途径,而这个不被子类化不像我们定义final类一样,这个我们是被迫的。

 

抱歉!评论已关闭.