您的位置:首页 > 其它

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

2006-10-19 10:55 267 查看
通常的类在没有构造函数的情况下,编译器会自动提供一个公有的、无参数的默认构造函数,因此,在编写类时没有提供构造函数和构造函数私有是不同的。
提供一个私有的构造函数,如果该构造函数不会被类自身所调用,则该类将保证不会被实例化。但是,这么做会使得该类不能被子类化,例如:
class A
{
private A()
{
}

}

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

为什么会这样?Java在处理构造函数的时候是这样的:首先编译器先检查是否提供显式的构造函数,如果没有则提供一个我们刚才提到的默认构造函数;其次,如果发现了显式的构造函数,则检查签名是否匹配,如果匹配则调用,如果不匹配则继续寻找,没有则报错。
很简单,Java在实例化一个类的时候,总是先从最超类开始调用构造函数,然后一步步的再调用子类的构造函数,直到调用到我们指定的那个子类。很显然,上面的代码如果在我们定义
B b=new B();
时,编译器会先调用Object的构造函数,然后是A的构造函数--哈!问题出来了,A的构造函数是private,当然就会报出上面的错误。
因此,提供私有化的构造函数是将该类不被实例化的一个很好的途径,但也是将该类不被子类化的最佳途径,而这个不被子类化不像我们定义final类一样,这个我们是被迫的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: