通过私有构造函数强化不可实例化的能力
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类一样,这个我们是被迫的。
提供一个私有的构造函数,如果该构造函数不会被类自身所调用,则该类将保证不会被实例化。但是,这么做会使得该类不能被子类化,例如:
class A
{
private A()
{
}
…
}
class B extends A
{
}
不管你是否使用了以上两个中任何一个类,编译该程序都将不会通过,提示:A()在A中是private
为什么会这样?Java在处理构造函数的时候是这样的:首先编译器先检查是否提供显式的构造函数,如果没有则提供一个我们刚才提到的默认构造函数;其次,如果发现了显式的构造函数,则检查签名是否匹配,如果匹配则调用,如果不匹配则继续寻找,没有则报错。
很简单,Java在实例化一个类的时候,总是先从最超类开始调用构造函数,然后一步步的再调用子类的构造函数,直到调用到我们指定的那个子类。很显然,上面的代码如果在我们定义
B b=new B();
时,编译器会先调用Object的构造函数,然后是A的构造函数--哈!问题出来了,A的构造函数是private,当然就会报出上面的错误。
因此,提供私有化的构造函数是将该类不被实例化的一个很好的途径,但也是将该类不被子类化的最佳途径,而这个不被子类化不像我们定义final类一样,这个我们是被迫的。
相关文章推荐
- Item 3:通过私有构造函数强化不可实例化的能力
- Java性能优化(3):通过私有构造函数强化不可实例化的能力
- 【Effective Java】Ch2_创建销毁对象:Item4_通过私有构造函数来强化不可实例化的能力
- 第4条:通过私有构造函数强化不可实例化的能力
- Android 编码规范:(四)通过私有构造器强化不可实例化的能力
- 通过私有构造器强化不可实例化的能力
- NO2 通过私有构造器强化不可实例化的能力
- effective java(4) 之通过私有构造器强化不可实例化的能力
- 4、通过私有构造器强化不可实例化的能力
- Effective Java 2.4—— 通过私有构造器强化不可实例化能力
- 第4条:通过私有构造器强化不可实例化的能力
- 通过私有构造器强化不可实例化的能力
- Effective Java 中文版第二版的读书心得(四)通过私有构造器强化不可实例化的能力
- Effective Java学习笔记之第4条 通过私有构造器强化不可实例化的能力
- Effective Java 第4条:通过私有构造器强化不可实例化的能力
- effective java读书笔记4:通过私有构造器强化不可实例化的能力
- 04、通过私有构造器强化不可实例化的能力
- 第四条:通过私有构造器强化不可实例化的能力
- 通过私有构造器强化不可实例化的能力
- 第4条:通过私有构造器强化不可实例化的能力