2014-12-26 42 views
16

Thực ra tôi không thể hiểu được sự khác biệt giữa một hàm tạo no-arg và hàm tạo mặc định là gì.Sự khác biệt giữa một hàm tạo không có arg và một hàm tạo mặc định trong Java

import javax.swing.*; 

public class Test extends JFrame { 
    public Test() { 
    super(); 
    this.setSize(200,200); 
    this.setVisible(true); 
    } 
    public static void main(Sting[] arg) { 
     Test cFrame = new Test(); 
    } 
} 

Điều này có gọi hàm tạo mặc định của lớp này trong khi tạo đối tượng Kiểm tra được gọi là cFrame không?

+5

không có nó không gọi constructor mặc định bây giờ không có constructor mặc định –

+5

cũng Vui lòng tham khảo [Java Mặc định Constructor] (http://stackoverflow.com/questions/4488716/java -default-constructor) –

+3

@CodeGeek cảm ơn –

Trả lời

20

Phương thức khởi tạo default là một hàm tạo không có hàm mà trình biên dịch Java chèn thay cho bạn; nó chứa một cuộc gọi default tới super(); (không phải supper()) là hành vi mặc định. Nếu bạn thực hiện bất kỳ hàm tạo nào thì bạn không còn nhận được một hàm tạo mặc định nữa.

JLS-8.8.9. Default Constructor nói (một phần),

Nếu một lớp không chứa khai báo constructor, sau đó một constructor mặc định không có thông số chính thức và không ném khoản được ngầm tuyên bố.

Nếu lớp được khai báo là đối tượng lớp nguyên thủy, thì hàm tạo mặc định có một phần trống. Nếu không, hàm tạo mặc định đơn giản gọi hàm tạo của lớp bậc trên không có đối số.

+3

Tôi là một fan hâm mộ lớn của bất kỳ cuộc gọi nào đến 'supper()' –

6

default constructor là một hàm tạo trình biên dịch Java thêm vào mã của bạn nếu không có hàm tạo rõ ràng nào khả dụng. Hàm khởi tạo mặc định gọi hàm tạo của lớp siêu không có arg.

Nếu bạn đã thêm hàm tạo của riêng mình (cho dù nó không có tham số hay tham số) thì trình biên dịch sẽ không thêm hàm tạo mặc định trong trường hợp này.

5

Nhà xây dựng mặc định là gì?

Đây là một hàm tạo được trình biên dịch thêm vào nếu bạn chưa định nghĩa một hàm tạo.

Nếu lớp của bạn có một hàm tạo thì trình biên dịch sẽ không thêm hàm tạo mặc định.

Vì vậy, trong trường hợp của bạn, bạn có các nhà xây dựng,

public Test(){ 
    super(); 
    this.setSize(200,200); 
    this.setVisible(true); 
    } 

Vì vậy, không có constructor mặc định hiện nay được gọi bởi JVM.

2

Trả lời là không. Biến tham chiếu cFrame sẽ gọi hàm tạo non-arg Test(), không phải hàm tạo mặc định. Trong khi hàm tạo Test() sẽ tìm thêm và gọi hàm tạo non-arg của lớp JFrame (Cha mẹ) và cứ như vậy Mỗi lớp phải có ít nhất một hàm tạo. Nếu không khai báo rõ ràng, trình biên dịch java cung cấp một hàm tạo không tham số, nghĩa là hàm tạo mặc định. Hàm khởi tạo mặc định này gọi hàm tạo non-parameterised của lớp cha của nó Nó khởi tạo biến lớp thành các giá trị mặc định của chúng.

Ví dụ:

Class Base {} 

Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables 

Trong khi nhà xây dựng không arg được xác định bởi chỉ một lập trình viên. Nó cũng có thể intializes các biến. Một điểm nữa để thêm ở đây là lệnh gọi super() được trình biên dịch java thêm tự động, nếu không tìm thấy siêu() trong lớp dẫn xuất.

Ví dụ:

Class Base { 

int y; 
    public Base() { 
    } 
    public int getY() { 
    return y; 
    } 

} 

public class Derived extends Base { 
private int x; 

public Derived() { //super() will be automatically used 
} 

public int getX() { 
return x; 
} 

public void setX(int x) { 
this.x = x; 
} 
} 

Derived d = new Derived(); 
System.out.println("Base x value => " + d.getX()); 

System.out.println("Base y value => " + d.getY()); 

Result: 

Base x value => 0 // Default value to its primitive datatype(In this case: int) 

Base y value => 0 
Các vấn đề liên quan