【问题标题】:Constructors in Java with implicit return typeJava中具有隐式返回类型的构造函数
【发布时间】:2014-09-12 19:07:05
【问题描述】:

我非常了解 Java 构造函数的所有内容,我将其写在下面以确保:

每次创建实例时初始化类中的所有变量可能很繁琐。

在首次创建对象时完成所有设置会更简单。

因为初始化的要求非常普遍,Java 允许对象在创建时自行初始化。 这种自动初始化是通过使用构造函数来执行的。

在创建对象后,在 new 运算符完成之前,构造函数会立即自动 c/d。 它们没有返回类型,甚至没有 void。

阅读 Herbert Schildt The Complete Reference 时,我遇到了这一段。

类的构造函数的隐式返回类型是类类型本身。初始化对象的内部状态是构造函数的工作,以便创建实例的代码立即拥有一个完全初始化的、可用的对象。

我发现自己对“隐式返回类型”这个术语感到非常困惑,即使我知道构造函数没有返回类型,甚至没有返回类型。

有人可以吗?

【问题讨论】:

  • 不确定你的问题,构造函数类似于其他方法,除了它返回类的实例,这就是为什么你不必做MyClass MyClass(String param) {}你可以省略第一个 MyClass因为所有的构造函数都做同样的事情
  • 这意味着没有设置器,并且必须存在对象的所有字段才能创建该类的对象。这是确保对象的所有字段都存在的好方法。

标签: java constructor


【解决方案1】:

基本上,这只是一段令人困惑的文字。正如您所说,构造函数没有返回类型的概念-您可以将它们视为 bit,就像具有相同类型的返回类型的方法一样,但是:

  • Java(令人讨厌)允许您直接声明这种方法,并且它不是构造函数:

    public class Test() {
        // This is a spectacularly unhelpful method name. 
        public Test Test() {
            return new Test();
        } 
    }
    
  • 行为并不完全相同,尤其是在链式构造函数中,所有构造函数都在同一个对象上工作。

  • 您永远不会退还任何东西。

我会尽量避免将构造函数视为方法——它们的特殊之处太多了。

【讨论】:

  • @ShirgillAnsari 我很惊讶你不知道他是谁!!
  • @ShirgillAnsari:如果有帮助,您应该考虑接受答案。如果您可以接受答案,请检查您的其他问题。
【解决方案2】:

如果有任何隐式返回值,我们会在字节码中看到它。下面是一个取自this article about bytecode的对象初始化示例:

Job job = new JobImpl();
4:  aload_0
5:  new #2; //class JobImpl
8:  dup
9:  invokespecial   #3; //Method JobImpl."<init>":()V
12: putfield    #4; //Field job:LJob;
15: return

5 创建新实例。 58 都将它放在堆栈上,因此可以通过构造函数调用 9 并保存引用 12 将其弹出两次。构造函数没有返回被保存的值。

构造函数字节码中也没有任何areturn会返回一个值:

public JobImpl();
  Code:
    0:  aload_0
    1:  invokespecial   #1; //Method java/lang/Object."<init>":()V
    4:  return

【讨论】:

  • @ShirgillAnsari 可能是javap -c JobImpl
【解决方案3】:

如果您将构造函数视为方法而不是构造函数,则它本质上接受参数并返回对象的新实例。这正是 Java 8 中发生的情况,您可以通过 ClassName::new 获取工厂方法。

这个功能对用户来说是模糊的,并且在构造函数中隐式调用super(),这意味着它们与常规函数/方法不太一样。从用户的角度来看,它们没有返回类型,但您可以将它们视为具有返回类型。

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多