【问题标题】:Are constructors in Java static in nature or non-static in nature?Java中的构造函数本质上是静态的还是非静态的?
【发布时间】:2017-11-09 19:37:30
【问题描述】:

有一个类似的问题 Constructor is static or non static

但很少有人说构造函数是静态的,也很少有人说构造函数是非静态的。这令人困惑。那么任何人都可以澄清构造函数本质上是静态的还是非静态的?

【问题讨论】:

  • stackoverflow.com/questions/7780406/… ?恕我直言,最好将构造函数视为特殊的东西(即不是真正的方法)
  • 你如何在这里定义静态?
  • 在构造函数属于类还是类的特定实例的意义上是静态的。
  • 我想说两者兼而有之。它属于类,因为您可以在没有类实例的情况下调用它。但它属于实例,因为您可以从构造函数体内引用/调用实例成员。

标签: java constructor


【解决方案1】:

这是 Java 规范在 §8.8.3. Constructor Modifiers 中所说的关于构造函数的内容:

与方法不同,构造函数不能是abstractstaticfinalnativestrictfpsynchronized

  • 构造函数不是继承的,所以不需要声明final

  • 永远无法实现abstract 构造函数。

  • 构造函数总是针对一个对象被调用,所以构造函数是static是没有意义的。

  • 实际上没有必要将构造函数设为synchronized,因为它会锁定正在构造的对象,而在该对象的所有构造函数完成工作之前,其他线程通常无法使用该对象。

  • 缺少native 构造函数是一种任意的语言设计选择,这使得Java 虚拟机的实现很容易验证在对象创建期间始终正确调用超类构造函数。

  • 无法将构造函数声明为strictfp(与方法(§8.4.3)相反)是一种有意的语言设计选择;它有效地确保构造函数是 FP-strict 当且仅当它的类是 FP-strict (§15.4)。

【讨论】:

    【解决方案2】:

    我不确定哪个答案让您感到困惑。但在 Java 中,构造函数不是静态的。

    请看下面的例子:

    public class MyTest {
        public static void main(String[] args) {
            new Test(); // Prints reference within the constructor
            new Test(); // The reference is different here
        }
    }
    
    class Test {
        public Test() {
            System.out.println(this.toString());
        }
    }
    

    如您所见,通过两次调用构造函数,您将获得对该对象的两个不同引用。这意味着构造函数的上下文不是静态的。

    你的类中可能有工厂方法,它们是静态的并创建实例:

    类测试{

    // May be called like Test.create() and returns instance
    public static Test create() {
        return new Test();
    }
    

    但在这些方法中,您仍然需要调用类构造函数。正如我之前所展示的,这不是静态的。

    【讨论】:

    • @Andreas 抱歉,两个不同的参考文献不是很清楚吗?
    • 您没有两个引用,因为代码永远不会到达第二个语句。 --- 另外,我没有说你错了,只是你需要解释一下。
    • 那么,如果你这样做Test t = Test.create(); Test t2 = Test.create();,两次调用一个静态方法来获得两个引用,这会使create方法非静态吗?
    • @Saathvik 如果引用不同,则对象不同。
    • @sepp2k 如果答案的point是构造函数内部的this每次都是不同的引用,那么答案应该说,这就是我一直要求的,以及为什么我仍然拒绝投票。答案没有说或解释任何关于this的事情,JB的评论也没有,所以就JB的评论而言,它突出了答案中缺乏解释,即答案是不清楚.
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2021-10-18
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多