将类作为final并将类构造函数设置为private是有区别的

final类和class构造函数之间的区别究竟是什么。

我知道两者都不能被分类(如果我错了,请纠正我)。 他们有什么不同吗?

最后一堂课不能延期。 它阻止了这一点

final class FinalClass { } // and later class ExtendedClass extends FinalClass { // ERROR } 

这对像String这样的东西很有用 – 你不希望有人能够覆盖String的逻辑,这是最常用的对象之一,并且能够,哦,我不知道,添加网络并发送所有你使用的字符串。 如果可以扩展String,则可以执行此操作。

私有构造函数不能在类外部调用。

 class PrivateCons { private PrivateCons() { } } // later PrivateCons pc = new PrivateCons(); // ERROR 

通常这最终会像这样工作:( java.lang.Math是一个很好的例子)

 class FuncLib { private FuncLib() { } // prevent instantiation public static void someFunc(...) { } public static int anotherFunc(...) { } } 

或者它最终像这样工作//整数实际上是这样做的

 class VerySpecial { private static Map 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} } 

扩展类时,默认情况下构造函数会尝试调用默认(无参数)构造函数。 如果它是私有的,那么在扩展它时必须显式调用非私有构造函数。 如果您没有非私人构造函数来调用,则无法扩展它。 感谢您发表评论。 🙂

实例化

  • 您无法使用私有构造函数实例化类。 但是您可以将它用作具有静态方法的实用程序类。
  • 最后一个类可以实例化但不能扩展,显然你不能用私有构造函数扩展一个类,因为隐式的super()调用会失败。

看看它有一个私有构造函数的Math类,无法实例化它有很多非常有用的静态方法

如果您不希望您的class级被分类,那么您使用final。 如果您不希望其他类实例化您的类,而是希望控制对象的构造和维护方式,则使用私有构造函数。

只拥有私人建设者比拥有最终阶级更强大。

详细说明:在类A中只有私有构造函数会强烈影响对象的创建。 通常,您使用的是工厂方法。 您仍然可以使用技巧(例如clone()或reflection调用私有构造函数)在没有工厂方法的情况下创建A的实例。 但子类化是不可能的 ,因为子类的构造函数需要能够调用super() 。 这只能在A内的嵌套类中实现。

仅具有私有构造函数通常是有意义的,例如通过工厂方法控制实例化,例如对于单元(参见Effective Java第3项)。 但即使在这种情况下,我也没有理由不写“最终类”,如果只是为了文档,那么读者会立即意识到不允许inheritance子类。

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() 

最终的类不能扩展,但它的构造函数可以是公共的。 私有构造函数可以从另一个构造函数调用或由内部类使用。

最终的类/方法永远不会被inheritance/覆盖,并且会抛出编译错误,因为具有私有构造函数的类也将抛出“没有默认构造函数可用于您的类”的编译,并且一旦你添加了非最终构造函数并调用它来自你的孩子class,没有错误。

私有构造函数在创建单例类(仅存在一个类的实例)的情况下非常有用,其中您将构造函数设为私有,并使用变量来存储单个实例,这将使用公共静态方法公开。 对于前

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

例如,java中的String类是最终类。