在Java中,构造函数返回什么?

在Java中,构造函数返回什么?,java,constructor,Java,Constructor,在发表了关于这个话题的帖子后,我发现自己有点困惑。 因此,我再次问: “Java构造函数是否返回任何值?” 我的书说他们不能返回值,但我的教授说他们可以,而且他们总是这样做 因为控制权需要转移给某个有价值的人,要么无效 构造函数返回它所属类的新实例,即使它没有显式的返回语句。这有点令人困惑:构造函数确实不返回值;是操作员new。但是,构造函数总是与new*一起使用,因此看起来它们总是返回一个值。 *这是一个轻微的简化:如果经过反射,您可以在不使用new的情况下使用构造函数。然而,同样的机制也将

在发表了关于这个话题的帖子后,我发现自己有点困惑。 因此,我再次问:

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

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


因为控制权需要转移给某个有价值的人,要么无效

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

这有点令人困惑:构造函数确实不返回值;是操作员
new
。但是,构造函数总是与
new
*一起使用,因此看起来它们总是返回一个值。

*这是一个轻微的简化:如果经过反射,您可以在不使用
new
的情况下使用构造函数。然而,同样的机制也将发挥作用。

我认为混淆纯粹是符号化的。当您声明构造函数时,您可以这样做:

public class Foo {
    public Foo() {}
}
这里没有显式的返回值

但是,实例化对象时,语法如下所示:

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


协调明显冲突的表示法的一种方法是,将构造函数视为返回正在构造的对象,但隐式返回。

我同意上述两种解释,并想添加一些语句以更清楚地说明:

问题:什么是构造函数: 答:这是一个与类同名的方法

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

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

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

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

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

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

构造函数

  • 与类的名称相同
  • 没有返回类型
  • 可以重载但不能重写
鉴于

方法

  • 可能与类的名称相同,也可能不相同
  • 有返回类型
  • 可以重载和重写
方法的语法:
AccessModifier返回类型类(…)
例如:公共静态void main(字符串[]args)

构造函数语法:
AccessModifier无返回类型类(…)
例如:公共静态main(字符串[]args)

请注意:


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

想象一下,在这样一种情况下,你被告知要画一只鹰

第一种情况:没有人告诉你它应该是什么样子。你只知道画一张鹰的草图

第二种情况:你被告知要使用什么颜色以及要画鹰的姿势

现在,第一个场景准确地描述了默认构造函数的功能,第二个场景是当您知道应该如何创建对象时。但除非你拿着铅笔和纸开始画草图,否则你不会得到任何回报


因此,当您使用新关键字调用构造函数时,会得到一个对象。虽然它没有显式返回某些内容,但它创建或构造了一些可以用作类实例的内容。

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

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

到目前为止,我关心的是构造函数将引用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(新的demo()); 输出:demo@1b6d3586.
因为每个对象在内存中都有其单独的堆区域,所以每个对象的引用id也不同。

构造函数返回引用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都是相同的

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


以下是语言规范()必须说明的内容:

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

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

因此调用构造函数,调用构造函数的表达式的结果是对新对象的引用。该规范没有说明构造函数返回该引用,它还将