2015-05-20 74 views
1

这似乎是相当的混淆的问题。根据定义,我知道构造函数是一种特殊类型的方法,用于初始化对象的状态和/或为实例变量赋值。如果构造函数没有任何返回类型,它将如何返回?

也有人在堆栈溢出提到,构造函数返回一个类的,而不是正常的方法做/返回?

尽管经历了很多教程和参考资料,但我无法找到一个具体的原因,就如何在不存在return语句的情况下构造函数能够返回值。

我很想知道整个过程的内部工作。

+2

一个构造函数不返回任何东西。 –

+0

这就是如何设计语言,构造函数“返回”对象本身的一个实例,这是自动完成的 – MadProgrammer

+0

构造函数不像普通方法那样调用,它使用'new'关键字调用。考虑有一个return语句,你甚至会返回什么,这将是不必要的 –

回答

3

构造函数不返回任何东西。构造函数只是初始化一个实例。

new instance creation expression

new SomeExample(); 

产生将指定的类

的新实例的引用一类新的实例被显式地创建当一个类 实例创建表达的评价(§15.9)导致类实例化为 。

,并调用相应的构造函数初始化该创建的实例

到新创建的对象的引用被返回作为 结果只要前,所指示的构造被处理使用来初始化新 对象以下过程:

  1. 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  2. 如果此构造在同一类(使用本)另一个构造的一个明确的构造函数调用(§8.8.7.1)开始,然后 评估该构造函数调用 递归使用这些相同的五个步骤的参数和过程。如果构造函数 调用突然完成,则此过程由于相同的原因突然完成 ;否则,继续执行步骤5

  3. 此构造不会在同一个类的另一个构造函数的显式构造函数调用开始(使用本)。如果 此构造函数用于Object以外的类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开始。评估参数和 处理该超类的构造函数调用递归使用这些 相同的五个步骤。如果该构造函数调用突然完成,则 由于相同的原因,此过程突然完成。否则, 继续执行步骤4。

  4. 执行实例初始化和实例变量初始值设定为这样的类,分配实例的可变 初始化的值给相应的实例变量,在 左到右的顺序在它们文本地出现在源代码 为班级。如果任何这些初始化程序的执行导致 异常,则不会处理进一步的初始化程序,并且此过程会因该同一异常而突然完成。否则, 继续执行第5步。

  5. 执行此构造函数的其余部分。如果执行突然完成,则此过程突然完成,原因相同。否则,此过程正常完成。

1

Java构造函数不返回任何内容。构造函数只是初始化特定类的对象的新实例。有时构造函数会有System.out.Println(“text”),这可能会导致你认为它返回了一些东西,但是你可以在任何没有返回类型的方法中使用该语句。

+0

@magoon - 同意,构造函数不返回任何东西。考虑到这一点,在正常情况下,人们会创建getter&setter方法来检索值,对吗?但是,在初始化之后的构造函数的情况下,在场景后面发生的提示代码显示输出的魔法是什么? – mindfreak

1

在字节码

Test1 t1 = new Test1(); 

如下所示

NEW test/Test1 //create an uninitized instance of Test1 
DUP 
NVOKESPECIAL test/Test1.<init>()V // call construcctor 
STORE 1  // save reference to created instance in local var 

,这是构造函数,其实无效方法具有特殊名称<init>

public <init>()V //V means no return value, void 
    L0 
    LINENUMBER 3 L0 
    ALOAD 0 
    INVOKESPECIAL java/lang/Object.<init>()V // call super constructor 
    RETURN 
+0

@dorofeev - 与我们在getter-setter方法中返回值相反,我希望知道即使没有返回语句也会促使构造函数显示输出的内部机制? **问题更关注“HOW ASPECT”?** – mindfreak

+0

'new'创建一个对象,在其上运行一个初始化程序(构造函数),然后返回对创建对象的引用 –

+1

@mindfreak“how”概念与两个事情:内存管理和生成的字节码。正如Evgeniy在他的回答中所显示的那样,生成的字节码实际上具有返回语句以将控制权释放给调用者。但是,它并不实际返回新创建的对象本身,而是返回该对象的内存引用。要比这更深入,可能会超出SO的范围。 – JNYRanger

相关问题