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

时间:2013-02-06 19:43:15

标签: java constructor

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

  

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

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

由于控件需要转移给某些有价值的人无效?

13 个答案:

答案 0 :(得分:31)

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

<小时/> * 这是一个小小的简化:如果你通过 reflection ,你可以使用没有new的构造函数。但是,相同的机制将起作用。

答案 1 :(得分:8)

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

答案 2 :(得分:6)

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

public class Foo {
    public Foo() {}
}

这里没有明确的返回值。

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

Foo foo = new Foo();

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

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

答案 3 :(得分:4)

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

构造

  • 与Class
  • 的名称相同
  • 没有返回类型
  • 可以重载但不会被覆盖。

,而

方法

  • 可能与“班级”的名称相同或不同。
  • 有返回类型
  • 可以重载和覆盖。

方法语法
AccessModifier ReturnType类(...)
EG: public static void main(String [] args)

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

请注意:

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

答案 4 :(得分:1)

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


这是语言规范(§15.9.4)必须说的:

  

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

     

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

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


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

现在,这是一个非常<笨>笨拙的心理模型,因为您必须想象一下:

  • 构造函数以隐式return this;结尾
  • 构造函数中的所有裸return;都隐式return this;
  • 隐式return this;仅在可达时存在,因为静态检查器(它会检查隐式代码,例如在默认的无参数构造函数中)禁止无法访问的代码,
  • 由于完全武断的原因,将语句this();super();用作表达式是非法的。

构造方法不返回任何内容的替代心理模型要简单得多,并且可行,没有任何警告。作为一名教育工作者,由于其简单性,我更喜欢教授这种心理模型。

但是,只要小心,两个思维模型都会对Java程序的行为做出相同的预测。从哲学上讲,它有点像对量子力学的不同解释。只要它们都做出相同的预测,就没有科学依据可以说一个特定的是正确的,而另一个则是错误的。相反,“构造函数不返回任何内容” 模型更简单且更易于应用,因此我认为它对学习和教导更为有用。

答案 5 :(得分:0)

我同意以上两种解释,并希望添加一些陈述以使其更加明确:

问题:什么是构造函数: 答案:它的名称与Class相同。

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

所以,我担心构造函数将引用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也会有所不同。

答案 8 :(得分: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相同

答案 9 :(得分:-1)

想象一下你被告知画一只鹰的情况。

第一种情景:你不会被告知它应该是什么样子。你所知道的只是制作一个鹰的简单草图

第二种情景:你被告知确切使用什么颜色以及描绘鹰的姿势

现在,第一个场景准确描述了默认构造函数的作用,第二个场景是当您获得有关应该如何创建对象的信息时。但除非你拿铅笔和纸并开始草绘,否则你将不会被退回任何东西。

因此,当您使用new关键字调用构造函数时,您将获得一个对象。虽然它没有明确地返回一些内容,但它创建或构造了一些可以用作类实例的东西。

答案 10 :(得分:-1)

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

答案 11 :(得分:-1)

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

答案 12 :(得分:-3)

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