当前位置: 首页 > 知识库问答 >
问题:

Java--私有构造函数vs最终和更多

段干玺
2023-03-14

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

如。:

public class This {
    private This () { }

    public someMethod( ){
    // something here
    }
   // some more-- no other constructors
}

据我所知,将所有构造函数私有化类似于将类“This”声明为final——因此它不能被扩展。

然而,我收到的Eclipse消息给我的印象是这是可能的——一个all constructors私有类可以扩展。看看这个:

当我试图用类似于

public class That extends This {
    ...
}

Eclipse给我一个错误:“隐式超级构造函数This()对默认构造函数不可见。必须定义显式构造函数。"

当我定义自己的构造函数时:

public class That extends This {
    That () {..} 
    ...
}

这一次我得到:“隐式超级构造函数this()对于默认构造函数不可见。必须显式调用另一个构造函数。”

有没有办法绕过这个问题--扩展一个所有构造函数都是私有的类?

如果是,如何?

如果否,阻止类被i.)扩展、使其构造函数私有和ii.)有什么区别将其定义为最终版本?

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

共有3个答案

杨阳飇
2023-03-14

据我所知,私有构造函数的一般用途是确保通过其他方法(即静态方法)完成对象构造。例如:

public class Something {

    private Something() { }

    public static Something createSomething() {
        Something ret = new Something();
        // configure ret in some specific way
        return ret;
    }

}

因此,私有构造函数限制类的实例化方式(而不是扩展方式)。

另一方面,将类标记为final用于明确表示类不能扩展。它是如何被实例化的完全是另一回事。

所以,虽然我不是100%,但如果有某种方法可以扩展一个拥有所有私有构造函数的类,问题是为什么要这样做?拥有私有构造函数和将类标记为final有两个不同的目的。

滕鸿畴
2023-03-14

具有私有构造函数的类不能实例化,同一类中的表单除外。这使得从其他类扩展它变得毫无用处(可能,但不会编译)。

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

拓拔烨赫
2023-03-14

您声明一个类finalvs.将其构造函数private用于不同的原因:

  • 我们将class确定为最终的,以表明该类不是为继承而设计的。
  • 你使所有的构造函数私有给予类对其实例化的控制。

换句话说,使用final控制继承,而使用private构造函数控制实例化。

请注意,声明构造函数私有仅禁止从外部继承。在类内部,您仍然可以使用命名或匿名派生类继承它。

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

 类似资料:
  • 问题内容: 假设有一个类,其所有构造函数都声明为private。 例如。: 据我所知,将所有构造函数设为私有类似于将类“ This”声明为 final ,因此无法进行扩展。 但是,我收到的Eclipse消息给我的印象是这是可能的-可以扩展全构造函数私有类。看看这个: 当我尝试使用类似的方法扩展此类时 Eclipse给了我一个错误:“ 隐式超级构造函数This()对于默认构造函数不可见。必须定义一个

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。

  • 我试图理解为什么在谈到构造函数时,类成员的可访问性之间存在差异。 考虑下面的例子: 的私有成员作为私有成员,不应从访问。对于字段和方法,情况确实如此,但构造函数似乎没有遵循相同的规则。 从JLS-8(6.6.1.确定可访问性)中,我们可以阅读: [...] 引用类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明该成员或构造函数允许访问时才可访问: > [……] 否则,成员或

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。

  • 问题内容: 最近,我经常使用枚举。所以我想知道… 私有Enum构造函数和带有任何可见性修饰符(package-private)的枚举构造函数之间有什么区别吗? 问题答案: 根据java 文档 枚举类型的构造函数必须是程序包私有或私有访问。 但加入了JLS 如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数为私有。 因此,package-private和private之间没有区别。