31

在继续关于这个主题的帖子之后,我发现自己有点困惑。所以我再次问这个:

“Java 构造函数是否返回任何值?”

我的书说它们不能返回值,但我的教授说它们可以并且他们总是这样做。

由于需要将控制权转移给具有某些价值的人,要么无效?

4

13 回答 13

39

这有点令人困惑:构造函数确实不返回值;它是运营商new。但是,构造函数总是与new*一起使用,所以看起来它们总是返回一个值。


*new这是一个轻微的简化:如果你通过反射,你可以使用构造函数。然而,同样的机制将发挥作用。

于 2013-02-06T19:45:21.820 回答
8

构造函数返回它所属类的新实例,即使它没有显式的返回语句。

于 2013-02-06T19:44:57.173 回答
8

我认为这种混淆纯粹是符号化的。当你声明一个构造函数时,你会这样做:

public class Foo {
    public Foo() {}
}

在这里,没有明确的返回值。

然而,当你实例化一个对象时,语法如下:

Foo foo = new Foo();

这通过分配内存和调用构造函数来创建一个新对象。在这里,结果显然是 的一个实例Foo

调和明显冲突的符号的一种方法是将构造函数视为返回正在构造的对象,但隐含地这样做。

于 2013-02-06T19:46:23.123 回答
5

构造函数是特殊的方法。那么构造函数和方法的基本区别在于

构造函数

  • 与Class同名
  • 没有返回类型
  • 可以重载但不能覆盖。

然而

方法

  • 可能与类的名称相同,也可能不同。
  • 有返回类型
  • 可以重载和覆盖。

方法的语法:
AccessModifier ReturnType Class(...)
例如: public static void main(String []args)

构造函数的语法:
AccessModifier No ReturnType Class(...)
EG: public static main(String []args)

请注意:

Java 是一种强类型语言,因此每个函数都有其返回类型,而构造函数总是返回该类的一个实例。

于 2014-08-29T15:18:08.497 回答
1

作为一名 Java 程序员,需要一个心智模型来预测 Java 程序在编译时和运行时的行为。只要一个人的心智模型与现实相比(即与语言规范描述的行为相比,或与实际Java实现的行为相比)做出正确的预测,那么心智模型是可行的。两种不同的、不相容的心智模型有时可能都是可行的,这就是一个例子。


以下是语言规范 ( §15.9.4 ) 所说的:

接下来,调用指定类类型的选定构造函数。...

类实例创建表达式的值是对指定类的新创建对象的引用。

所以构造函数被调用,调用构造函数的表达式的结果是对新对象的引用。规范没有说构造函数返回那个引用,也没有说构造函数返回那个引用。


让我们考虑“构造函数返回对新对象的引用”的心理模型。它确实具有直觉意义。当您在表达式中调用构造函数时new Object(),表达式具有值,就像您在foo.bar()表达式中调用方法时,表达式具有值一样。在后一种情况下,表达式的值是方法的返回值,因此在前一种情况下,表达式的值是构造函数的返回值可能会很直观。

现在,这是一个非常笨拙的心智模型,因为你必须想象:

  • 构造函数以隐式结尾return this;
  • 构造函数中的每个barereturn;都是隐式的return this;
  • 隐式return this;仅在可访问时才存在,因为静态检查器(检查隐式代码,例如在默认的无参数构造函数中)禁止无法访问的代码,
  • 由于完全任意的原因,当用作表达式时,语句this();和是非法的。super();

另一种心智模型,即构造函数不返回任何内容,要简单得多,并且在没有任何警告的情况下是可行的。作为一名教育工作者,我喜欢教授这种心智模型,因为它很简单。

但只要你小心,两个心智模型都会对 Java 程序的行为做出相同的预测。从哲学上讲,这有点像对量子力学的不同解释;只要他们都做出相同的预测,那么就没有科学依据可以说某个特定的预测是正确的而其他的预测是错误的。相反,“构造函数不返回任何东西”模型只是更简单,更容易应用,所以在我看来,学习和教学更有用。

于 2019-11-18T01:05:24.020 回答
1

所以,到目前为止,我关心的是构造函数将引用 id 返回到该类的引用变量。举个例子:

class demo
{
    demo{}
}
class demo1
{
    public static void main(String as[])
    {
        demo d = new demo();
        System.out.println(d);
    }
}

输出:demo@7d4991ad 它是构造函数返回的类 demo 的对象 'd' 的引用 id。如果你不定义你的构造函数,那么 jvm 将从默认构造函数中获取这个 id。

您可以通过以下行交叉检查: System.out.println(new demo()); 输出:demo@1b6d3586。由于每个对象在内存中都有其单独的堆区域,因此每个对象的引用 id 也会有所不同。

于 2016-04-16T19:57:40.083 回答
0

我同意以上两种解释,并想补充一些陈述以使之更清楚:

问题:什么是构造函数:答案:它是一个名称与类相同的方法。

问题:构造函数是否返回任何内容?答:不,甚至没有。

问题:如何调用构造函数?或者如何调用构造函数?答案:通过使用 NEW 关键字创建对象。

问题:如何创建对象?答案:创建对象的一种方法是使用 NEW 运算符,它返回一个对象实例。

于 2013-02-06T20:18:57.393 回答
0

根据定义,不可能从构造函数返回值。构造函数不支持任何返回类型

于 2014-04-23T13:11:46.130 回答
0

构造函数返回引用 id。我做了一个小程序来证明它

class Alpha {
    void myMethod() {
        System.out.println(this);// prints same reference ID
    }

    public static void main(String[] args) {
        Alpha alpha = new Alpha();
        System.out.println(alpha);// prints the reference ID
        alpha.myMethod();
    }
}

输出

Alpha@16f65612
Alpha@16f6512

您可以清楚地看到两个参考 ID 相同

于 2019-08-06T20:55:54.610 回答
-1

想象一下,你被告知要画一只鹰。

第一个场景:你没有被告知它应该是什么样子。你所知道的就是画一个鹰的简单草图

第二个场景:你被告知要使用什么颜色以及绘制鹰的姿势

现在,第一个场景准确地描述了默认构造函数的作用,而第二个场景是当您获得有关如何创建对象的信息时。但是,除非您拿起铅笔和纸开始素描,否则您将不会得到任何回报。

因此,当您使用 new 关键字调用构造函数时,您会得到一个对象。尽管它没有显式返回某些东西,而是创建或构造了可以用作类的实例的东西。

于 2014-10-31T06:23:53.100 回答
-1

是的,它是当前的类实例。(我们不能使用返回类型,但它会返回一个值)。

于 2015-04-21T08:52:08.477 回答
-1

构造函数在非常低的级别返回类的详细结构(例如数据和方法将使用多少内存空间)+执行构造函数中编写的代码。而 new 运算符将构造函数的返回作为其操作数并在运行时分配内存并将其处理程序返回给类变量。

于 2016-04-05T16:15:26.783 回答
-3

隐式构造函数返回类类型............

于 2014-01-16T07:49:44.990 回答