为什么构造函数不能是最终的

为什么不能构造函数在Java中是最终的,静态的或抽象的?

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

public class K { abstract public K() { // ... } } 

当你把一个方法设置为final它的意思是:“你不希望任何类覆盖它。” 但是构造函数(根据Java语言规范)不能被覆盖,所以它是干净的。

当你设置一个abstract的方法时,它的意思是:“该方法没有一个主体,应该在一个子类中实现”。 但是,当使用new关键字时,构造函数被隐式调用,所以它不能缺less一个主体。

当你将一个方法设置为static它意味着:“该方法属于类,而不是一个特定的对象。 但是构造函数被隐式调用来初始化一个对象,所以没有静态构造函数的目的。

这个问题真的是你为什么要构造函数是static or abstract or final

构造函数没有被inheritance,所以不能被重载,所以最终的构造函数有什么用处

构造函数在创build类的实例时自动调用,它可以访问类的实例字段。 什么将是一个静态构造函数的使用。

构造函数不能被覆盖,所以你会怎么做一个抽象的构造函数。

一个Java构造函数隐含地是最终的和隐式的静态的1 ,而对Java构造函数来说是抽象的是没有意义的。

这意味着finalstatic修饰符将是多余的, abstract关键字根本就没有意义。

当然,Javadevise人员在构造函数中没有看到允许使用冗余和/或无意义的访问修饰符…所以Java语法不允许这些修饰符。

除此之外:他们没有对publicabstract修饰符也是多余的接口方法进行相同的devise调用,但无论如何都是允许的。 也许这有一些(古代)的历史原因。 但无论如何,如果没有渲染(可能)数以百万计的现有Java程序是不可编译的,那么无法解决这个问题。


1 – 实际上,构造函数具有静态和非静态语义的混合。 你不能在一个实例上“调用”一个构造函数,而且它不能被inheritance或覆盖。 这与静态方法的工作方式类似。 另一方面,构造函数的主体可以引用this ,并调用实例方法…就像一个实例方法。 然后是构造函数链接,这对构造函数是唯一的。 但真正的一点是,这些方面是固定的,没有一点允许一个冗余的static修改器。

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

  • 默认构造函数 :只能在相同的包中创build对象。

  • protected构造函数 :只有当它是子类时,对象才能由包之外的类创build。

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

staticfinalabstract关键字对构造函数没有意义,因为:

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

  • abstract类是一个部分实现的类,它包含了要在子类中实现的抽象方法。

  • final限制修改:variables变成常量,方法不能被覆盖,类不能被inheritance。

最后 :因为无论如何您都不能覆盖/扩展构造函数。 你可以扩展一个类(为了防止你做到最后)或覆盖一个方法(以防止你做到最后),但是对于构造函数来说这没有什么。

静态 :如果你看执行的构造函数是不是静态的(它可以访问实例字段),如果你看看调用方这是(种)静态(你没有一个实例调用它,很难想象一个构造函数完全是静态的或者不是静态的,在这两件事之间没有语义上的分离,把它们和修饰符区分开来是没有意义的。

摘要 :摘要只有在覆盖/扩展的情况下才有意义,所以与“最终”相同的论点适用

不可以将构造函数声明为final。 你的编译器总是给出一个types为“modifier final not allowed”的错误。当应用于方法时,Final意味着该方法不能在子类中重写。 构造函数不是普通的方法。 (不同的规则适用)另外,构造函数从不被inheritance。 所以在宣布最终决定时没有任何意义。

  1. 构造函数不是普通的方法。 (适用不同的规则)
  2. 此外,构造函数从来没有被inheritance。 所以在宣布最终决定时没有任何意义。 没有build设者永远不能被宣布为最终的。 Y我们的编译器将总是给出types为“modifer final not allowed”的错误
  3. 检查JLS第8.8.3节(JLS和API文档应该是您的一些主要信息来源)。

JLS 第8条提到了这一点。

构造函数(§8.8) 与方法类似 ,但不能通过方法调用直接调用; 它们被用来初始化新的类实例。 像方法一样,它们可能被重载(§8.8.8)。

但是每个构造函数都不是常规方法。 他们不能这样比较。

为什么构造函数不能是静态的,最终的定义在上面的答案中。

摘要:“抽象”意味着没有实现。 只能通过inheritance来实现。 所以当我们扩展一些类的时候,所有的父类成员都在子类(子类)中inheritance,除了“构造器”。 那么,让我们假设,你怎么设法声明构造函数“Abstract”,比如何在子类中给它的实现,当构造函数没有在子类中获得inheritance?

这就是为什么构造函数不能抽象。

让我们看看第一个公开的K(){

*上面的修饰符最后是限制因为如果它是最后的一些情况下,在一些其他类或同一类只有我们会覆盖它,这样就不会发生在这里接近不是最终例如:

 we want public void(int i,String name){ //this code not allowed 

让静态,静态itz所有关于类级别,但我们创build基于对象的构造函数通过使用'新'关键字,所以,,,,,, thatsall

这里抽象的itz最糟糕的不是因为没有任何抽象的方法或者任何被声明的方法