为什么施工人员不能是最终的

sac*_*hin 77 java syntax constructor

为什么构造函数不能是Java中的final,static或abstract?

例如,你能解释一下为什么这是无效的吗?

public class K {

    abstract public K() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 160

设置方法时,final它意味着:"我不希望任何类覆盖它." 但根据Java语言规范:

JLS 8.8 - "构造函数声明不是成员.它们永远不会被继承,因此不会被隐藏或覆盖."

当您设置方法时,abstract它意味着:"此方法没有正文,应该在子类中实现." 但是当使用new关键字时,隐式调用构造函数,因此它不能缺少正文.

设置方法时,static意思是:"此方法属于类,而不是特定对象." 但隐式调用构造函数来初始化一个对象,因此没有静态构造函数的目的.

  • 什么是JLS?如果你在第一次使用时解释这个首字母缩略词,它可能对某些人有用.没关系,我把它放进去. (6认同)
  • JLS 是 Java Language Specification 的缩写 (2认同)

Ran*_*Rag 39

这个问题确实是你想要构造函数的原因static or abstract or final.

构造函数不是继承的,因此无法覆盖,因此最终构造函数的用途是什么

创建类的实例时会自动调用构造函数,它可以访问类的实例字段.静态构造函数的用途是什么.

无法覆盖构造函数,因此您将使用抽象构造函数执行什么操作.


Ste*_*n C 14

Java构造函数是隐式最终的,其语义的静态/非静态方面是隐式的1,并且Java构造函数是抽象的没有意义.

这意味着finalstatic修饰符将是多余的,并且abstract关键字根本没有任何意义.

当然,Java设计者在任何方面都没有看到在构造函数上允许冗余和/或无意义的访问修饰符......所以Java语法不允许这些.

除此之外:遗憾的是,他们没有对接口方法进行相同的设计调用,其中publicabstract修饰符也是多余的,但无论如何都允许.也许这有一些(古老的)历史原因.但无论如何,如果不渲染(可能)数以百万计的现有Java程序无法编译,它就无法修复.


1 - 实际上,构造函数具有静态和非静态语义的混合.您无法"调用"实例上的构造函数,并且它们不会被继承或覆盖.这类似于静态方法的工作方式.另一方面,构造函数的主体可以引用this,并调用实例方法......就像实例方法一样.然后是构造函数链接,这对于构造函数是唯一的.但真正的一点是,这些语义是固定的,没有必要允许冗余且可能令人困惑的static修饰符.


mah*_*esh 9

  • public构造函数:可以在任何地方创建对象.

  • 默认构造函数:只能在同一个包中创建对象.

  • protected构造函数:只有当对象是子类时,才能通过包外的类创建对象.

  • private构造函数:对象只能在类中创建(例如,在实现单例时).

static,finalabstract关键字是没有意义的,因为构造函数:

  • static 成员属于一个类,但构造函数需要创建一个对象.

  • abstract类是部分实现的类,它包含在子类中实现抽象方法.

  • final 限制修改:变量变为常量,方法不能被覆盖,并且类不能被继承.


Jen*_*der 6

最后:因为无论如何都无法覆盖/扩展构造函数.你可以扩展一个类(以防止你使它成为最终)或覆盖一个方法(以防止你使它成为最终的),但是对于构造函数没有这样的东西.

静态:如果你看一下执行一个构造函数不是静态的(它可以访问实例字段),如果你看一下调用者那么它是(某种)静态的(你没有实例就调用它.很难想象一个构造函数如果完全是静态的或不是静态的,并且在这两个事物之间没有语义分离,则用修饰符区分它们是没有意义的.

摘要:摘要只有在覆盖/扩展的情况下才有意义,因此适用与"final"相同的参数


Jim*_*ani 6

不能将构造函数声明为final.您的编译器将始终给出"modifier final not allowed"类型的错误.当应用于方法时,Final意味着该方法无法在子类中重写.构造函数不是普通的方法.(适用不同的规则)此外,构造函数永远不会继承.因此宣布最终决定没有任何意义.