2010-04-04 38 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

Hãy xem xét chỉnh sửa tiêu đề của câu hỏi này cho một cái gì đó như "Java: là constructor của tôi ở đây trả về một giá trị?" Tôi có một câu hỏi cụ thể về cách Java trả về các giá trị từ các nhà xây dựng và tôi nghĩ câu hỏi này là chủ đề tổng quát hơn ... Thay vào đó là "Trợ giúp, tôi không thể gán giá trị trả về cho hàm tạo của mình!" – Jan

Trả lời

22

Điều bạn đã xác định không thực sự là một hàm tạo, nhưng phương thức được gọi là Const. Nếu bạn đã thay đổi mã của bạn để một cái gì đó như thế này, nó sẽ làm việc:

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

Nếu không có nhà xây dựng cụ thể được xác định một cách rõ ràng, trình biên dịch sẽ tự động tạo một constructor không có đối số.

1

Hàm tạo không thể trả về giá trị. Đó là cuối cùng. Nó cùng ý nghĩa - nó không thể có kiểu trả về và đó là lý do tại sao bạn nhận được lỗi biên dịch. Bạn có thể nói rằng giá trị trả về luôn ngầm là đối tượng được tạo bởi hàm tạo.

9

Trên thực tế Constructor trong một lớp học java không thể trả về giá trị nó phải nằm trong các hình thức sau đây

public class Test { 
public Test(/*here the params*/) { 
    //this is a constructor 
    //just make some operations when you want to create an object of this class 
} 
} 

kiểm tra những liên kết này http://leepoint.net/notes-java/oop/constructors/constructor.html http://java.sun.com/docs/books/tutorial/java/javaOO/constructors.html

1

Một constructor không thể có một giá trị trả về giống như một hàm "bình thường". Nó được gọi khi một istance của lớp trong câu hỏi được tạo ra. Nó được sử dụng để thực hiện khởi tạo của trường hợp đó.

22

Nhà xây dựng không thể trả về giá trị; họ trả lại vật thể được xây dựng, để nói.

Bạn gặp lỗi vì trình biên dịch đang tìm kiếm một hàm tạo lấy chuỗi làm đối số của nó. Vì bạn đã làm không phải là tuyên bố một hàm tạo nên hàm tạo duy nhất có sẵn là hàm tạo mặc định không nhận bất kỳ đối số nào.

Tại sao tôi nói bạn không khai báo một hàm tạo? Bởi vì ngay sau khi bạn khai báo một giá trị trả về/kiểu cho phương thức của bạn, nó không phải là một hàm tạo nữa mà là một phương thức thông thường.

Từ Java Documentation:

Một lớp học có chứa cấu trúc cho là viện dẫn để tạo các đối tượng từ các kế hoạch chi tiết lớp. Constructor khai báo trông giống như phương thức khai báo — ngoại trừ việc chúng khai báo tên của lớp và không có loại trả về .

Nếu bạn xây dựng những gì bạn đang cố gắng để đạt được ai đó có thể cho bạn biết cách bạn có thể đạt được mục tiêu đó.

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

Bạn nên tạo một hàm toString() thay vì getMyString(). Vì vậy, bạn có thể thực hiện 'System.out.println (myConst)' – Rhs

0

Tôi nghĩ rằng cách tốt nhất để tạo ra hiệu ứng mà bạn muốn sẽ được như sau:

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!")); 
    } 
} 

này thay thế public String Const() phương pháp bạn sử dụng trước đó, và bằng cách ghi đè các phương pháp public String toString() của Object (Mà tất cả Các lớp Java kế thừa từ) giá trị String của đối tượng được in chính xác khi bạn muốn in đối tượng, vì vậy phương thức chính của bạn vẫn không thay đổi.

5

Một hàm tạo không thể trả về giá trị vì hàm khởi tạo ngầm trả về ID tham chiếu của đối tượng và vì hàm tạo cũng là phương thức và phương thức không thể trả về nhiều giá trị. Vì vậy, chúng tôi nói một cách rõ ràng constructor không có một giá trị trả về.

2

Đã có nhiều câu trả lời tuyệt vời. Tôi chỉ muốn thêm rằng, nếu bạn muốn lấy một số mã trả về tách biệt với chính đối tượng như là kết quả của việc gọi một hàm tạo, bạn có thể bọc hàm tạo trong một factory method, khi tạo, có thể ví dụ làm một số xác nhận dữ liệu trong đối tượng được xây dựng và trả lại một boolean tùy thuộc vào kết quả.

0

Để trả lại giá trị từ một hàm tạo - chỉ cần chuyển vào mảng dưới dạng tham số. Để minh họa nguyên tắc:

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 
    } 

} 

}

Các vấn đề liên quan