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()
不应该更有意义。
对主题更加清淡
答案 0 :(得分:5)
当您编写classname obj = new classname()
时,new
运算符会创建并返回该对象。构造函数用于初始化它(例如设置任何字段),因此不会返回任何内容。
您可以将其视为3个步骤
new
创建对象new
调用刚刚创建的对象的构造函数new
返回已创建的对象您可以阅读有关object creation in the Java Tutorial的更多信息。
答案 1 :(得分:2)
这是一个规则。构造函数没有返回类型。当您致电new Foo()
时,您正在使用new
运算符,后跟构造函数调用。
构成表达式的new
运算符,并返回Foo
类型的对象。
如果构造函数有返回类型,则可以编写
Foo something = Foo();
或只是(假设返回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);
所以他们最终选择了这种语法。
答案 2 :(得分:0)
这里构造函数没有返回任何东西,这个语句只返回分配了obj对象的内存地址。 &安培;这是新运营商的工作,这就是为什么我们需要新的运营商
答案 3 :(得分:0)
构造函数不返回任何内容。构造函数用于初始化实例变量。当你说
Foo f = new Foo();
new 运算符会创建一个Foo对象。
答案 4 :(得分:0)
即使在字节码级别,构造函数也不会返回任何内容。它与返回void
的方法具有相同的返回类型,而是将对象作为this
的参数进行初始化。
注意:没有选项可以返回不同的对象,这就是为什么需要工厂方法。