2014-07-25 19 views
7

Tôi đã viết lớp đơn giản này trong java chỉ để thử nghiệm một số tính năng của nó.java "void" và "non void" constructor

public class class1 { 
    public static Integer value=0; 
    public class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

Đầu ra là:

Nhưng trong mã này:

public class class1 { 
    public static Integer value=0; 
    public void class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

Kết quả của mã này là:

Vậy tại sao không, khi tôi sử dụng void trong khai báo phương thức khởi tạo, trường tĩnh của lớp không thay đổi nữa?

+9

Thứ hai không phải là hàm tạo. Nó chỉ là một phương pháp xảy ra để chia sẻ một tên với lớp của nó. – murgatroid99

+1

Vì nó không còn là một hàm tạo. –

+4

câu trả lời cho câu hỏi tương tự này [Tại sao các nhà thầu trong java không có kiểu trả về] (http://stackoverflow.com/questions/6801500/why-do-constructors-in-java-not-have-a-return- loại) cho một lý do tuyệt vời. – Doswell

Trả lời

30

Trong Java, hàm tạo không phải là một phương thức. Nó chỉ có tên của lớp và khả năng hiển thị cụ thể. Nếu nó tuyên bố rằng trả về một cái gì đó, sau đó nó không phải là một nhà xây dựng, thậm chí nếu nó tuyên bố rằng trả về một void. Lưu ý sự khác biệt ở đây:

public class SomeClass { 
    public SomeClass() { 
     //constructor 
    } 
    public void SomeClass() { 
     //a method, NOT a constructor 
    } 
} 

Ngoài ra, nếu một lớp không xác định hàm tạo, thì trình biên dịch sẽ tự động thêm hàm tạo mặc định cho bạn.

+2

Có thể lập luận rằng một hàm tạo là một trường hợp đặc biệt của một phương thức được sử dụng để khởi tạo một cá thể của đối tượng, vì nó hỗ trợ cú pháp 99% những gì mà một hàm tạo hỗ trợ. – Makoto

+0

Tránh loại nhầm lẫn này là một lý do tốt khác để thực hiện theo các quy ước đặt tên phương thức [trong JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html). – azurefrog

+0

@Makoto Trong Java, [một hàm tạo cụ thể là một cái gì đó trông rất giống một phương thức nhưng không phải là một phương thức] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8 .html # jls-8.8). – chrylis

5

void công khai class1() không phải là một hàm tạo, nó là một phương thức void có tên trùng khớp với tên lớp. Nó không bao giờ được gọi. Thay vào đó java tạo ra một hàm tạo mặc định (vì bạn chưa tạo ra một hàm), nó không làm gì cả.

1

Sử dụng khoảng trống trong hàm tạo theo định nghĩa khiến nó không còn là hàm tạo. Hàm tạo cụ thể không có kiểu trả về. Mặc dù void không trả lại giá trị theo nghĩa hẹp nhất của từ, nhưng nó vẫn được coi là một kiểu trả về.

Trong ví dụ thứ hai (nơi bạn sử dụng khoảng trống), bạn sẽ phải thực hiện h.class1() cho phương thức được gọi vì nó không còn là hàm tạo. Hoặc bạn chỉ có thể loại bỏ khoảng trống.

0

Đây được cho là lỗi thiết kế trong Java.

class MyClass { 

    // this is a constructor 
    MyClass() {...} 

    // this is an instance method 
    void MyClass() {...} 

} 

Hoàn toàn hợp pháp. Có lẽ không nên, nhưng là.

Trong ví dụ của bạn, class1() không bao giờ được gọi, bởi vì nó không phải là một hàm tạo. Thay vào đó, constructor mặc định được gọi.

Đề xuất: tự làm quen với quy ước đặt tên Java. Tên lớp phải bắt đầu bằng chữ hoa.

+0

'MyClass x = new MyClass(); x.MyClass(); 'Hoàn toàn hợp lệ. – Cerbrus