Java 为什么可以';构造函数是最终的、静态的还是抽象的?

Java 为什么可以';构造函数是最终的、静态的还是抽象的?,java,syntax,constructor,Java,Syntax,Constructor,为什么在Java中构造函数不能是最终的、静态的或抽象的 例如,你能解释一下为什么这是无效的吗 public class K { abstract public K() { // ... } } Final:因为您无论如何都不能覆盖/扩展构造函数。您可以扩展一个类(以防止将其设置为final)或覆盖一个方法(以防止将其设置为final),但对于构造函数来说,没有类似的方法 静态:如果查看构造函数的执行情况,它不是静态的(它可以访问实例字段),如果查看调用方,它是

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

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

public class K {

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

Final:因为您无论如何都不能覆盖/扩展构造函数。您可以扩展一个类(以防止将其设置为final)或覆盖一个方法(以防止将其设置为final),但对于构造函数来说,没有类似的方法

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


抽象:抽象只在存在覆盖/扩展的情况下才有意义,因此与“final”相同的参数适用

问题实际上是为什么您希望构造函数是
静态的、抽象的或最终的

构造函数不是继承的,所以不能被重写,那么有什么用呢 有最终的建造师

当类的实例被调用时,将自动调用构造函数 创建后,它可以访问类的实例字段。将是什么 静态构造函数的使用

<?php

abstract class AbstractClass 
{
   public abstract function __construct();
}

class NormalClass 
{
    public final function __construct() {
        echo "Final constructor in a normal class!";
    }
}
构造函数不能被重写,那么您将如何处理抽象 构造器

<?php

abstract class AbstractClass 
{
   public abstract function __construct();
}

class NormalClass 
{
    public final function __construct() {
        echo "Final constructor in a normal class!";
    }
}
JLS提到了这一点

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


但是构造函数并不是常规方法。它们无法进行比较。

当您将方法设置为
final
时,它的意思是:“我不希望任何类重写它。”但根据Java语言规范:

-“构造函数声明不是成员。它们从不被继承,因此不会被隐藏或重写。”


当您将方法设置为
abstract
时,它意味着:“此方法没有主体,应该在子类中实现。”但是当使用
new
关键字时,会隐式调用构造函数,因此它不会缺少主体


当您将方法设置为
static
时,它意味着:“此方法属于类,而不是特定对象。”但是构造函数是隐式调用来初始化对象的,因此使用静态构造函数没有任何意义。

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

<?php

abstract class AbstractClass 
{
   public abstract function __construct();
}

class NormalClass 
{
    public final function __construct() {
        echo "Final constructor in a normal class!";
    }
}
这意味着
final
static
修饰符将是多余的,而
abstract
关键字将毫无意义

当然,Java设计人员没有看到在构造函数上允许冗余和/或无意义的访问修饰符……因此Java语法不允许使用这些修饰符

旁白:令人遗憾的是,他们没有对接口方法进行相同的设计调用,
public
abstract
修饰符也是冗余的,但无论如何都是允许的。这可能有一些(古老的)历史原因。但无论哪种方式,都无法在不渲染的情况下修复(可能)数百万现有Java程序无法编译



1-实际上,构造函数混合了静态和非静态语义。你不能“调用”一个实例上的构造函数,它不被继承或重写。这类似于静态方法的工作方式。另一方面,构造函数的主体可以引用
这个
,并调用实例方法…就像实例方法一样。还有构造函数链,这是构造函数所特有的。但真正的要点是这些语义是固定的,不允许使用冗余且可能令人困惑的
静态
修饰符。

上述答案很好地定义了构造函数不能是静态和最终修饰符的原因

摘要:“抽象”意味着没有实现。它只能通过继承来实现。因此,当我们扩展某个类时,除“构造函数”外,所有父类成员都在子类(子类)中继承。因此,让我们假设,您知道如何将构造函数声明为“抽象”,则当构造函数在子类中没有继承时,如何在子类中给出它的实现

这就是为什么构造函数不能 摘要。

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

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

  • 受保护的
    构造函数
    :只有当对象是子类时,才可以由包外部的类创建对象

  • private
    constructor
    :只能在类内部创建对象(例如,在实现单例时)

静态
最终
抽象
关键字对构造函数没有意义,因为:

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

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

  • final
    限制修改:变量变为常量,方法不能重写,类不能继承

    • 让我们先看看 最终公开K(){

      *上面的修饰符final是restrict,因为如果它是final,那么在某些情况下,在其他类或同一类中,只有我们会覆盖它,所以这里不会发生近似的非final 例如:

      设static,,static itz全部ab