Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类作为final和将类构造函数作为private有什么区别_Java_Constructor_Final - Fatal编程技术网

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;
}}