假设有一个类,其所有构造函数都声明为private。
例如:
public class This {
private This () { }
public someMethod( ){
// something here
}
// some more-- no other constructors
}
据我所知,将所有构造函数设为私有类似于将“This”类声明为 final - 因此无法扩展它。
然而,我得到的Eclipse消息给我的印象是这是可能的 - 可以扩展所有构造函数 - 私有类。看看这个:
当我尝试用类似
的东西扩展这个类时public class That extends This {
...
}
Eclipse给我一个错误:“隐式超级构造函数This()对默认构造函数不可见。 必须定义一个显式构造函数。“
当我定义自己的构造函数时:
public class That extends This {
That () {..}
...
}
这次我得到: “隐式超级构造函数This()对于默认构造函数不可见。 必须显式调用另一个构造函数。“
有没有办法绕过这个 - 扩展一个所有构造函数都是私有的类?
如果是,怎么样?
如果不是,那么阻止一个类被延长的区别是什么 i。)使其构造函数成为私有的 ii。)将其定义为最终?
注意:我在其他一些讨论中看到Can a constructor in Java be private?。
答案 0 :(得分:20)
您声明了一个类final
而不是因为不同的原因而使其构造函数private
:
final
表示该类不是为继承而设计的。private
为该类提供对其实例化的控制。换句话说,使用final
控制继承,而使用private
构造函数控制实例化。
请注意,声明构造函数private
仅禁用外部继承。在类中,您仍然可以使用命名或匿名派生类继承它。
当你创建类private
的所有构造函数时,你需要一个公共的static
方法来使类可用。一种常见的static
方法是工厂方法:您可以让类的用户通过公共静态方法间接调用私有构造函数。
答案 1 :(得分:3)
除了同一个类中的表单外,无法实例化具有私有构造函数的类。这使得从antoher类扩展它是无用的(可能,但不会编译)。
这并不意味着它根本不能被子类化,例如在内部类中你可以扩展并调用私有构造函数。
答案 2 :(得分:1)
据我所知,private
构造函数的一般用途是确保通过其他方法(即静态方法)完成对象构造。例如:
public class Something {
private Something() { }
public static Something createSomething() {
Something ret = new Something();
// configure ret in some specific way
return ret;
}
}
因此私有构造函数限制了类的实例化方式(而不是如何扩展)。
另一方面,将类标记为final
用于明确表示无法扩展类。如何实例化完全是另一回事。
所以虽然我不是100%,如果有某种方法来扩展一个拥有所有私有构造函数的类 - 问题是你为什么要这样做?拥有私有构造函数并将类标记为final有两个不同的目的。