构造函数是否在java中返回任何值?

时间:2017-05-16 12:17:32

标签: java constructor

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();
    }
}

7 个答案:

答案 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()

的类Point

当你做

foo = new Point();构造函数返回一个新的point实例。

你可以做到

foo.getX()

相同
new Point().getX()

enter image description here

答案 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"