2010-04-04 131 views
15
$ cat Const.java 
public class Const { 
    String Const(String hello) { 
     return hello; 
} 
public static void main(String[] args) { 
    System.out.println(new Const("Hello!")); 
} 
} 
$ javac Const.java 
Const.java:7: cannot find symbol 
symbol : constructor Const(java.lang.String) 
location: class Const 
    System.out.println(new Const("Hello!")); 
        ^
1 error 
+0

考虑修改这个问题是这样的标题“的Java:是我在这里的构造函数返回值?”我有一个关于Java如何从构造函数返回值的具体问题,我认为这个问题是关于更一般的主题的......相反,它就像“帮助,我无法为构造函数分配返回值! – Jan 2012-02-02 22:28:16

回答

22

你定义的实际上并不是一个构造函数,而是一种叫做Const的方法。如果你改变了你的代码,这样的事情,它的工作:

Const c = new Const(); 
System.out.println(c.Const("Hello!")); 

如果没有特定构造的明确定义,编译器会自动创建一个无参数的构造函数。

1

构造函数不能返回值。这是最后的。同样的道理 - 它不能有返回类型,这就是你得到编译错误的原因。你可能会说返回值总是隐式的由构造函数创建的对象。

1

值构造函数不能有返回值像一个“正常”功能。当有问题的类别被创建时调用它。 它用于执行该实例的初始化。

22

构造函数不能返回值;他们返回构建的对象,可以这么说。

由于编译器正在寻找一个将字符串作为其参数的构造函数,因此出现错误。既然你做了而不是声明了一个构造函数,唯一可用的构造函数是没有任何参数的默认构造函数。

为什么我说你没有声明构造函数?因为只要你为你的方法声明了一个返回值/类型,它不再是一个构造函数,而是一个常规方法。

Java Documentation

一类包含 调用,以从 类蓝图对象构造函数。构造函数 声明看起来像方法 声明 - 除了它们使用 类的名称并且没有返回 类型。

如果您详细说明您试图达成的目标,可能有人会告诉您如何实现该目标。

0
public class Const { 
    private String myVar; 

    public Const(String s) { 
    myVar = s; 
    } 

    public String getMyString() 
    { 
     return myVar; 
    } 

    public static void main(String[] args) { 
    Const myConst = new Const("MyStringHere"); 
    System.out.println(myConst.getMyString()); 
    } 
} 
+1

你应该做一个toString()函数而不是getMyString()。所以你可以做'System.out.println(myConst)' – Rhs 2012-12-05 23:03:33

0

我认为,产生你想要将是继效应的最好方法:

public class Const { 

    private String str; 

    public Const(String hello) { 
     str = hello; 
    } 

    public String toString() { 
     return str; 
    } 

    public static void main(String[] args) { 
     System.out.println(new Const("Hello!")); 
    } 
} 

这样就取代了以前使用的public String Const()方法,并通过覆盖的Objectpublic String toString()方法(所有Java类继承自)当要打印对象时,对象的String值被正确打印,所以您的主要方法保持不变。

5

构造函数不能返回值,因为构造函数隐式返回对象的引用ID,并且由于构造函数也是方法,并且方法不能返回多个值。所以我们说明确的构造函数没有返回值。

2

已经有很多很棒的答案。我想补充一点,如果你想通过调用一个构造函数得到一些与对象本身分离的返回代码,你可以将构造函数包装在一个factory method中,在创建后可以在内部做一些数据验证构造的对象并根据结果返回boolean

0

要从构造函数传回一个值 - 只需传入一个数组作为参数即可。 为了说明一个道理:

Test() { 
    Boolean[] flag = new Boolean[1]; 
    flag[0] = false; 
    new MyClass(flag); 
    System.out.println(flag[0]); // Will output 'true' 
} 

class MyClass { 
    MyClass(Boolean[] flag) { 
     // Do some work here, then set flag[0] to show the status 
     flag[0] = true; 
    } 
} 
0
/************************************************ 
    Put the return value as a private data member, which gets 
    set in the constructor. You will need a public getter to 
    retrieve the return value post construction 
******************************************************/ 

class MyClass 
{ 
    private Boolean boolReturnVal; 

    public Boolean GetReturnVal() { return(boolReturnVal); } 
    MyClass() // constructor with possibly args 
    { 
     //sets the return value boolReturnVal 
    } 

public static void main(String args[]) 
{ 
    MyClass myClass = new MyClass(); 

    if (myClass.GetReturnVal()) 
    { 
     //success 
    } 

} 

}