JAVA中的构造函数是否返回任何值?
因为我们知道构造函数没有任何返回类型
但是java中的构造函数是否会向对象返回任何值,即当前的类实例?
如果是的话,请你解释一下原因.. !!
提前致谢...!!
请考虑以下示例,请解释构造函数是否返回任何值。
class Constructors
{
public int id;
public String name;
Constructors() //default constructor(no-args)
{
id=3913;
name="Saran";
}
Constructors(int idNew,String nameNew) //parameterized constructor
{
id=idNew;
name=nameNew;
}
void display()
{
System.out.println("ID : "+id);
System.out.println("Name : "+name);
}
public static void main(String args[])
{
Constructors s1=new Constructors();
Constructors s2=new Constructors(123,"teja");
s1.display();
s2.display();
}
}
答案 0 :(得分:2)
它们本身不返回值,因为它们没有任何返回值。他们所做的是,他们创建了一个对象的实例。
创建对象时的关键字new
是以某种方式“返回”新创建的对象。
因此,构造函数本身就是设置对象的值。
答案 1 :(得分:2)
不。 Java构造函数无法返回值。如果需要,只需创建一个调用所需构造函数并返回所需值的方法。请参见下面的示例。
public class Tester {
public Tester(){}
public static Tester getInstance(){
Tester tester = new Tester();
return tester;
}
}
答案 2 :(得分:1)
<强> TLDR 强>
构造函数确实是一个void
方法,但是它的调用会产生一个可利用的结果,可以在变量中使用或存储。
所以说构造函数返回的东西最终是对语言的误用,但由于MyClass myClass = new MyClass()
是创建对象的非常经典的方法,我们可以理解为什么使用这种滥用语言的快捷方式。
一方面,从JLS - Chapter 2. The Structure of the Java Virtual Machine - 2.9. Special Methods,你可以看到构造函数是一个void方法(没有返回类型):
类或接口最多只有一个类或接口初始化 方法并通过调用该方法初始化(第5.5节)。的的 类或接口的初始化方法具有特殊名称 ,没有参数,并且无效(§4.3.3)。
但另一方面,从JLS - 12.4.2. Chapter 12. Execution - Detailed Initialization Procedure开始,您可以读到构造函数返回对新创建对象的引用:
就在返回对新创建的对象的引用之前 结果,处理指示的构造函数以初始化新的 使用以下过程对象:
我将尝试通过使用带有空的无arg构造函数的简单类,通过直接调用构造函数创建实例的void方法以及使用new
运算符创建实例的另一个来检查它:
package init;
public class MyClass {
public void createMyClassWithConstructor() {
MyClass myClass = new MyClass();
}
public MyClass createMyClassWithAMethod() {
MyClass myClass = new MyClass();
return myClass;
}
}
以下是反汇编代码:
Compiled from "MyClass.java"
public class init.MyClass {
public init.MyClass();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public void createMyClassWithConstructor();
Code:
0: new #1 // class init/MyClass
3: dup
4: invokespecial #15 // Method "<init>":()V
7: astore_1
8: return
public init.MyClass createMyClassWithAMethod();
Code:
0: new #1 // class init/MyClass
3: dup
4: invokespecial #15 // Method "<init>":()V
7: astore_1
8: aload_1
9: areturn
}
我们可以注意到void createMyClassWithAMethod()
方法和MyClass()
构造函数都没有返回任何内容:return
是最后执行的JVM指令,而return
JVM指令意味着从方法。
只有MyClass getMyClass()
方法返回对象的引用:7: areturn
。
所以,说构造函数是一个特殊的(invokespecial
)void方法是正确的。
但事实上,即使它的API级别构造函数是一个void方法,我们也可以在反汇编代码中注意到JVM将构造函数创建的引用分配给createMyClassWithAMethod()
中的局部变量:
4: invokespecial #15 // Method "<init>":()V is invoked on the object and
// the result is put on the stack.
7: astore_1 // stores the reference into a local variable 1.
因此,即使语义上构造函数调用没有返回任何内容,它也会产生一个结果(或输出),可用于对变量进行赋值。
答案 3 :(得分:0)
看起来他们不会返回某些内容,但他们会返回已创建的类</ p>实例
构造函数甚至返回它所属的类的新实例 如果它没有明确的退货声明。
想象具有吸气剂getX()
和getY()
当你做
时 foo = new Point();
构造函数返回一个新的point实例。
你可以做到
foo.getX()
与
new Point().getX()
答案 4 :(得分:0)
构造函数用于初始化类的对象。 使用构造函数,不会返回任何内容,但会将值分配给类属性或变量。
答案 5 :(得分:0)
构造函数的主要目的是初始化实例变量。 构造函数不返回任何值,因为它没有返回类型。 当我们创建一个新的对象构造函数时,构造函数会自动调用,并且特定的实例变量将存储在堆区域中。
构造函数的原型是
access-modifier class-name(){}
答案 6 :(得分:-1)
构造函数就像一个特殊的方法,它构造并返回类的实例。
Constructors s2=new Constructors(123,"teja");
// Returns an instance of the class Constructors, initialized with 123, "teja"
// and stores it in variable "s2"
Constructors s3=new Constructors(321,"ajet");
// Returns an instance of the class Constructors, initialized with 321, "ajet"
// and stores it in variable "s3"