【问题标题】:Does a Java constructor return the Object reference?Java 构造函数是否返回 Object 引用?
【发布时间】:2014-10-29 08:47:28
【问题描述】:

我知道 Java 的构造函数不能有任何类型,有趣的是它甚至不能是 void。一个合乎逻辑的解释是构造函数返回初始化对象的引用。

MyClass myObject = new MyClass();

myClass 的构造函数现在将在实例化后返回对象引用并将其保存在对象变量MyObject 中,这就是构造函数不能有返回类型的原因。

对吗?有人可以证实这一点吗?

【问题讨论】:

    标签: java constructor reference


    【解决方案1】:

    不,实际上,构造函数被编译到类文件like methods having the name <init> and a void return type. 中,您可以在堆栈跟踪中看到这些"<init>" 调用。表达式new Type() 被编译为指令new,它只创建Type 的实例和一个附加的方法调用(invokespecial) 到Type 中声明的构造函数之一。

    验证器将确保在新创建的实例上准确地调用一次这样的特殊方法,并且在对该对象进行任何其他使用之前调用它。

    从 Java 语言的角度来看,让构造函数没有返回类型只是一个编程语言设计决定。毕竟,new Type(…) 一个表达式,它计算出新创建的Type 实例,并且你无法从具有该编程语言构造的构造函数中获取返回值。此外,如果添加返回类型,Java 将无条件假定它是一个方法,即使它与类同名。

    That’s simply how it was defined:(它使解析类定义更容易)

    ConstructorDeclarator 中的 SimpleTypeName 必须是包含构造函数声明的类的简单名称,否则会发生编译时错误。

    在所有其他方面,构造函数声明看起来就像没有结果的方法声明(第 8.4.5 节)。

    【讨论】:

    • 好的,但是如果默认构造函数是无效的,为什么我不能手动使它无效呢? public void MyClass(){...} 将在错误中恢复。
    • public void MyClass(){...} 是一个 method 声明,无论周围的类是否命名为 MyClass。根据定义。构造函数没有返回类型(类的名称,至少在源代码级别)
    • aah 所以你可以说它没有返回类型被编译器识别为构造函数.. ?
    • @philx_x:是的,你可以这么说。允许与类同名的普通方法的决定可能值得商榷,但事实就是如此,因此返回类型会有所不同。
    【解决方案2】:

    我想您可以说构造函数具有专门用于返回所需对象的实例的“特殊语法”。在这些情况下,您无需指定返回类型。 new 关键字与构造函数方法一起使用,以生成类类型的实例。

    如果您想控制实例生成方法的返回类型,那么您可能应该考虑使用一种工厂设计模式,其中静态方法创建一个实例(使用构造函数),然后返回更明确的类型(例如,超类型或接口类型)。

    当您想根据某个参数决定返回哪种类型,但将实际类型隐藏给实例生成方法的使用者时,此模式非常有用。

    【讨论】:

      【解决方案3】:

      构造函数不是方法。它不返回任何东西。它用于初始化目的,当这些初始化依赖于参数或有可能引发异常时尤其有用(尽管两者都是可选的)。

      因此,与方法不同的是,它不是继承的,也没有返回类型(甚至没有 void)。

      【讨论】:

      • 谢谢,但我知道构造函数是什么,我想知道为什么他没有返回类型。
      • 原因是它不是一个方法。返回值是方法的一个特征。但是构造函数不是作为方法调用的,因此它没有返回值。
      【解决方案4】:

      这个想法是您通过调用构造函数本身来“构造” MyClass 的一个实例。构造函数的思想是实例化而不是返回。创建 myObject 后,您可以引用其声明的公共方法和变量部分,这将为您提供作为调用应答返回的所需数据。重要的是要了解构造函数不会返回任何内容,它只是创建一个实例,然后可以使用该实例来引用在实例化类中声明的方法和变量(返回数据)。

      【讨论】:

        猜你喜欢
        • 2010-10-03
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多