当前位置: 首页 > 面试题库 >

Java —私有构造函数vs最终函数

郎宏逸
2023-03-14
问题内容

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

例如。:

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中的构造函数可以私有吗?在其他一些讨论中。


问题答案:

具有私有构造函数的类只能被实例化,除非该类内部具有表单。这使它无法从其他类中扩展出来(可能,但不会编译)。

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



 类似资料:
  • 假设有一个类,其所有构造函数都声明为private。 如。: 据我所知,将所有构造函数私有化类似于将类“This”声明为final——因此它不能被扩展。 然而,我收到的Eclipse消息给我的印象是这是可能的——一个all constructors私有类可以扩展。看看这个: 当我试图用类似于 Eclipse给我一个错误:“隐式超级构造函数This()对默认构造函数不可见。必须定义显式构造函数。"

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

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

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

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 问题内容: 我有一堂课。 在我的类方法中,我实例化该类,如下所示: 编译器将此代码转换为: 使用反射表明该类具有以下综合的构造函数: 由于该类是,因此编译器会将该构造函数添加到该类中,因此没有人可以实例化该类。但是很明显,该类应该能够实例化它,因此编译器添加了另一个包私有构造函数,后者又调用了私有构造函数。另外,由于package- private构造函数的名称中包含该名称,因此普通的Java代码