2013-03-30 48 views
5

Tôi luôn luôn nghĩ rằng nhà xây dựng không được thừa kế, nhưng nhìn vào mã này:Thừa kế hàm tạo Java?

class Parent { 

Parent() { 
    System.out.println("S1"); 
} 

} 
class Child extends Parent { 

Child(){ 

    System.out.println("S2"); 
} 


} 

public class Test5 { 
public static void main(String[] args) { 
    Child child = new Child(); 

} 
} 

//RESULT: 
//S1 
//S2 

Nó cho thấy rằng trẻ em được thừa hưởng constructor. Tại sao có S1 trên kết quả? Có khả năng để tạo ra 2 nhà xây dựng mà không có tham số và chỉ có con constructor trên kết quả mà không có cơ sở constructor (chỉ S2) ??

Trả lời

1

Java doc nói:

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.

Nếu bạn không khai báo một constructor của bất kỳ loại, một mặc định được thêm.

Nếu bạn không gọi bất kỳ hàm tạo nào khác trong dòng đầu tiên của lớp con của bạn, lệnh gọi đến super() được thực hiện.

1

Constructor không được kế thừa.

Trình tạo lớp siêu hạng không được kế thừa trong lớp dẫn xuất.

Có khả năng tạo 2 hàm tạo không có tham số và chỉ có hàm tạo con trên kết quả không có hàm tạo cơ sở.

Không, không thể của nó Trong Java mọi hàm tạo lớp dẫn xuất gọi hàm tạo siêu lớp. Nếu bạn không thêm nó, không gọi hàm tạo đối số.

public SuperClass() { 
    ... 
} 

public DerivedClass() { 
    //Compiler here call no argument constructor of Super class. 
} 
0

Bạn viết:

Nó cho thấy rằng trẻ em được thừa hưởng constructor.

Không thể kế thừa các nhà xây dựng. Các lớp có thể được kế thừa, vì vậy Child không kế thừa bất kỳ hàm tạo nào. Trẻ thừa hưởng lớp cha mẹ. Cha mẹ kế thừa đối tượng lớp. Khi bạn gọi hàm con (constructor) con, tự động một hàm tạo của đối tượng được gọi và sau đó là một hàm tạo cha, trước khi mã của hàm tạo con chạy.

này lý do tại sao bạn sẽ có được kết quả này:

S1 
S2 
13

Dù bạn đang nhìn thấy ở đây được gọi là constructor chaining. Bây giờ là gì Constructor Chaining:

Việc tạo chuỗi xảy ra thông qua việc sử dụng thừa kế. Nhiệm vụ đầu tiên của phương thức khởi tạo của lớp con là gọi phương thức khởi tạo của lớp cha ' . Điều này đảm bảo rằng việc tạo đối tượng lớp con bắt đầu với việc khởi tạo các lớp ở trên nó trong chuỗi thừa kế .

Có thể có bất kỳ số lượng lớp nào trong chuỗi kế thừa. Mỗi phương thức khởi tạo sẽ gọi chuỗi cho đến khi lớp học ở đầu trang đã được truy cập và khởi tạo.Sau đó, mỗi lớp tiếp theo dưới đây là được khởi tạo khi chuỗi gió quay trở lại lớp con ban đầu. Quá trình này được gọi là xây dựng chuỗi. (Source)

Đó là những gì xảy ra trong chương trình của bạn. Khi bạn biên dịch chương trình của bạn, bạn Child được biên dịch để theo cách này bởi javac:

class Child extends Parent 
{ 
    Child() 
    { 
    super();//automatically inserted here in .class file of Child 
    System.out.println("S2"); 
    } 
} 

Và lớp chuyên của bạn được chuyển đổi sang sau:

Parent() 
{ 
    super();//Constructor of Object class 
    System.out.println("S1"); 
} 

Đó là lý do tại sao sản lượng của bạn được hiển thị như:

S1 //output from constructor of super class Parent 
S2 //output from constructor of child Class Child 
0

Một hàm tạo sẽ luôn gọi hàm tạo của lớp bậc trên của nó trừ khi một hàm tạo rõ ràng đã được định nghĩa. Từ Java Language Specification:

Nếu một cơ quan nhà xây dựng không bắt đầu bằng một lời gọi constructor rõ ràng và các nhà xây dựng đã được công bố không phải là một phần của lớp Object nguyên thủy, sau đó cơ thể constructor ngầm bắt đầu với một constructor gọi cha "siêu (); ", một lời gọi hàm tạo của lớp cha trực tiếp của nó không có đối số.

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