1

statement_1:每当定义类的构造函数时,都会跳过返回类型,即构造函数不返回任何内容。因此,即使它也不能被宣布为无效。

statement_2:但是classname obj = new classname()遇到JVM会创建一个对象并返回一个对obj变量的引用。

这两种说法都是正确的。现在我想知道 statement_2 与 statement_1 的关系。

我的问题是obj如果构造函数没有返回任何东西,如何初始化?意味着它确实返回了一些东西,那么它应该具有类的返回类型。

class Myclass{
              Myclass Myclass(){
                                   //return something of Myclass type 
               }

}

那么Myclass obj = new Myclass()它不应该更有意义。

对这个话题有更多的了解

4

5 回答 5

5

当您编写classname obj = new classname()时,它是new创建和返回对象的运算符。构造函数用于初始化它(例如设置任何字段),因此不返回任何内容。

您可以将其视为 3 个步骤

  1. new创建对象
  2. new在刚刚创建的对象上调用构造函数
  3. new返回创建的对象

您可以在 Java 教程中阅读有关对象创建的更多信息。

于 2012-09-23T08:55:24.420 回答
2

这是一条规则。构造函数没有返回类型。当您调用时,new Foo()您使用的是new运算符,然后是构造函数调用。

它是构成表达式并返回类型对象的new运算符。Foo

如果构造函数有返回类型,你就可以写

Foo something = Foo();

或者只是(假设 return void

Foo();

但这两条代码都是非法的。构造函数调用必须始终new运算符开头。new运算符创建一个类型的对象(Foo例如分配存储空间),将该对象传递给构造函数进行初始化,最后将初始化的实例返回给调用者。

您可能想知道为什么对象创建语法如此接近正常的方法调用。我想这是允许将参数传递给构造函数。他们本可以制作一种特殊的语法,例如

Foo foo = new Foo

请注意缺少的括号,因此这与方法调用不同。但是,如何将参数传递给构造函数?也许只是通过列出它们

Foo foo = new Foo "Hello", "World"

但是这种语法与在单个语句中初始化两个或多个变量的语法冲突,即

Number a = new Integer(12), b = new Float(1.2);

所以他们最终选择了这种语法。

于 2012-09-23T08:56:10.723 回答
0

这里的构造函数没有返回任何东西,这个语句只返回分配了 obj 对象的内存地址。& 它是 new operator 的工作,这就是我们在这里需要 new operator 的原因

于 2012-09-23T08:57:34.977 回答
0

构造函数不返回任何东西。构造函数旨在初始化您的实例变量。当你说

    Foo f = new Foo();

new运算符创建一个 Foo 对象。

于 2012-09-23T08:58:43.820 回答
0

即使在字节码级别,构造函数也不会返回任何内容。它与返回的方法具有相同的返回类型,void 而是将对象作为参数作为this初始化参数。

注意:没有选项返回不同的对象,这就是需要工厂方法的原因。

于 2012-09-23T08:58:56.620 回答