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

Dev*_*eva 17 java constructor final

最终类和将类构造函数作为私有类之间的区别究竟是什么.

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

cor*_*iKa 9

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

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}
Run Code Online (Sandbox Code Playgroud)

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

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

class PrivateCons {

    private PrivateCons() {

    }
}

// later
PrivateCons pc = new PrivateCons(); // ERROR
Run Code Online (Sandbox Code Playgroud)

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

class FuncLib {
    private FuncLib() { } // prevent instantiation
    public static void someFunc(...) { }
    public static int anotherFunc(...) { }
}
Run Code Online (Sandbox Code Playgroud)

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

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}

}
Run Code Online (Sandbox Code Playgroud)

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

  • @Adam严格来说,你可以创建扩展外部类的内部类,但是,除此之外,你不能扩展类. (6认同)

Far*_*mor 5

实例化

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

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