8

假设有一个类,其所有构造函数都声明为私有。

例如。:

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.) 将其定义为final有什么区别?

注意:我看到Java 中的构造函数可以是私有的吗?在其他一些讨论中。

4

3 回答 3

24

您出于不同的原因声明一个类final与创建其构造函数:private

  • 您制作类final以表明该类不是为继承而设计的。
  • 你让所有的构造函数private让类控制它的实例化。

也就是说,使用final控件继承,而使用private构造函数控件实例化。

请注意,声明构造函数private只会禁用来自外部的继承。在类内部,您仍然可以使用命名或匿名派生类继承它。

当您创建该类的所有构造函数时,private您需要一个static公开的方法以使该类可用。一种常见的static方法是工厂方法:您可以让类的用户通过公共静态方法间接调用私有构造函数。

于 2013-08-30T01:00:14.703 回答
4

不能实例化具有私有构造函数的类,除非在同一个类中形成形式。这使得从另一个类扩展它是无用的(可能,但不会编译)。

这并不意味着它根本不能被子类化,例如在内部类中你可以扩展和调用私有构造函数。

于 2013-08-30T01:01:55.873 回答
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 有两个不同的目的。

于 2013-08-30T00:59:53.610 回答