Java 将类作为final和将类构造函数作为private有什么区别
最终类和将类构造函数作为私有类之间的区别到底是什么Java 将类作为final和将类构造函数作为private有什么区别,java,constructor,final,Java,Constructor,Final,最终类和将类构造函数作为私有类之间的区别到底是什么 我知道两者都不能被子类化(如果我错了,请纠正我)。他们有什么不同吗?最后一节课不能延长。它防止了这种情况 final class FinalClass { } // and later class ExtendedClass extends FinalClass { // ERROR } 这对于字符串之类的东西很有用-你不会希望有人能够覆盖字符串的逻辑,字符串是最常用的对象之一,并且能够,哦,我不知道,添加网络并将所有使用的字符串发送
我知道两者都不能被子类化(如果我错了,请纠正我)。他们有什么不同吗?最后一节课不能延长。它防止了这种情况
final class FinalClass {
}
// and later
class ExtendedClass extends FinalClass { // ERROR
}
这对于字符串之类的东西很有用-你不会希望有人能够覆盖字符串的逻辑,字符串是最常用的对象之一,并且能够,哦,我不知道,添加网络并将所有使用的字符串发送回你。如果可以扩展字符串,则可以执行此操作
不能在类外部调用私有构造函数
class PrivateCons {
private PrivateCons() {
}
}
// later
PrivateCons pc = new PrivateCons(); // ERROR
通常情况下,结果是这样的:(java.lang.Math就是一个很好的例子)
或者它最终像这样工作//Integer实际上是这样做的
class VerySpecial {
private static Map<String,VerySpecial> cache;
public static VerySpecial generate(String data) {
VerySpecial result = cache.get(data);
if(result == null) {
result = new VerySpecial(data);
cache.put(data,result);
}
return result;
}
private String data;
private VerySpecial() { }
private VerySpecial(String data) { this.data = data}
}
类非常特殊{
私有静态地图缓存;
公共静态VerySpecial生成(字符串数据){
VerySpecial result=cache.get(数据);
如果(结果==null){
结果=新的非常特殊(数据);
cache.put(数据、结果);
}
返回结果;
}
私有字符串数据;
私有VerySpecial(){}
private VerySpecial(字符串数据){this.data=data}
}
扩展类时,默认情况下,构造函数会尝试调用默认(无参数)构造函数。如果它是私有的,那么在扩展非私有构造函数时必须显式调用它。如果没有可调用的非私有构造函数,则无法扩展它。感谢您的评论指出这一点。:-) 实例化
- 不能用私有构造函数实例化类。但是,您可以将其用作带有静态方法的实用程序类
- 最后一个类可以实例化,但不能扩展,显然,您不能使用 作为隐式super()调用的私有构造函数将失败
看看数学类,它有一个私有构造函数,无法实例化,但它有许多静态方法,这些方法非常有用只有私有构造函数比拥有一个最终类更强大 详细内容: 类a中只有私有构造函数会严重影响对象的创建。通常情况下,您使用的是工厂方法。您仍然可以使用技巧(如clone()或反射性调用私有构造函数)在没有工厂方法的情况下创建的实例。但是子类化是不可能的,因为子类的构造函数需要能够调用
super()
。这只能在a中的嵌套类中实现
只有私有构造函数通常是有意义的,例如通过工厂方法来控制实例化,例如对于Singleton(参见有效的Java项目3)。但即使在这种情况下,我也不认为有理由不编写“final class”(如果只是为了文档),以便读者立即理解子类化是不允许的。
private
成员可以通过内部类访问
public class Outer {
private Outer() {
System.out.println("Outer()");
}
static class Inner extends Outer {
{
System.out.println("Inner()");
}
}
public static void main(String... args) {
new Inner();
}
}
印刷品
Outer()
Inner()
不能扩展最终类,但其构造函数可以是公共的。私有构造函数可以从另一个构造函数调用,也可以由内部类使用。如果不希望将类划分为子类,则使用final。如果您不希望其他类实例化您的类,而是希望控制对象的构造和维护方式,您使用私有构造函数。最终类/方法永远不能被继承/重写,并将抛出编译错误,其中带有私有构造函数的类也将抛出编译“您的类没有可用的默认构造函数”,一旦您添加了非最终构造函数并从子类调用它,不会有错误 私有构造函数在创建singleton类(一个类只能存在一个实例)时非常有用,在这种情况下,可以将构造函数设置为私有,并使用一个变量来存储单个实例,该实例将通过公共静态方法公开。 例如
例如,java中的字符串类是最后一个类。你能扩展一个所有构造函数都是私有的类吗?如果你的所有构造函数都是私有的,你就不能扩展这个类了。JVM能为最后一个类进行优化吗?(不是说我们应该关心优化,除非存在真正的、可测量的问题,而是出于兴趣…)@glowCoder你的意思是说,对于最终类,我们可以创建类的实例,但是对于具有私有构造函数的类,我们不能创建实例。@严格来说,亚当可以创建扩展外部类的内部类,但是是的,除此之外,您不能扩展该类。您可以使用私有构造函数实例化一个类。例如,对于模式MyObject.newInstance(),它是必需的,其中newInstance调用私有构造函数。(当您无法使用普通构造函数时,这是必要的,因为它会泄漏
此
引用。)newInstance()将抛出IllegaAccessException,除非您使用的构造函数具有setAccessible(true)。@Peter抱歉。我只是指一个自制的新实例,没有任何反射。它只是一个从私有构造函数返回新实例生成的静态方法。@TOTOO2,您可以使用constructor.newInstance()
(更改访问权限后),而不是MyClass.class.newInstance()
Outer()
Inner()
public class Singleton{
private static final Singleton instance = new Singleton();
//private constructor to avoid client applications to use constructor
private Singleton(){}
public static Singleton getInstance(){
return instance;
}}