2012-01-25 1 views
6

Có một thể hiện của siêu lớp được tạo khi chúng ta khởi tạo một lớp cụ thể trong java. Nếu đó là trường hợp thì sẽ có rất nhiều chi phí của việc khởi tạo tất cả các lớp siêu. Tôi cố gắng mã sau:Có một thể hiện của siêu lớp được tạo khi chúng ta khởi tạo một đối tượng không?

public class AClass { 
    public AClass() { 
     System.out.println("Constructor A"); 
    } 
} 

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     BClass b = new BClass(); 
    } 
} 

Đầu ra của mã này là:

Constructor A 

Constructor B 

Vì vậy, không có nghĩa là hệ thống phân cấp toàn bộ các đối tượng của superclasses được tạo ra khi chúng ta khởi tạo một lớp học?

Trả lời

8

Một đối tượng đơn lẻ được tạo - nhưng đối tượng đó một phiên bản của cả lớp cha và lớp con (và chính bản thân số java.lang.Object). Không có ba đối tượng riêng biệt. Có một đối tượng với một tập hợp các trường (về cơ bản là sự kết hợp của tất cả các trường được khai báo lên xuống phân cấp) và một tiêu đề đối tượng.

Các nhà xây dựng được thực thi theo cách phân cấp thừa kế - nhưng tham chiếu this sẽ giống nhau đối với tất cả các nhà xây dựng đó; tất cả chúng đều góp phần vào việc khởi tạo một đối tượng duy nhất.

+0

Tôi luôn nghĩ (không chính xác) rằng một lớp con riêng biệt và một đối tượng siêu lớp riêng biệt được tạo ra khi tạo một đối tượng của một lớp con. – abc

+0

Và đây là cách nó hoạt động trong Python cũng như cho vấn đề đó C++ (Tôi tin rằng, tôi đã không thử nó mặc dù). Đúng ? – abc

2

Vâng, đó là toàn bộ điểm thừa kế của lớp.

Bạn không khởi tạo hai đối tượng, mặc dù: bạn đang khởi tạo một đối tượng và chạy cả hai AClass và sau đó là hàm tạo BClass trên đó. Phương thức khởi tạo AClass chịu trách nhiệm khởi tạo các phần được kế thừa từ AClass và hàm tạo BClass chịu trách nhiệm khởi tạo những thứ bổ sung được xác định trong BClass.

+0

Tôi luôn luôn nghĩ (không chính xác) rằng một phân lớp riêng biệt và một đối tượng siêu lớp riêng biệt được tạo ra khi tạo một đối tượng của một lớp con. – abc

2

Có.

BClass constructor trông như thế này:

public BClass() 
{ 
    super(); // hidden line, added by compiler 
    System.out.println("Constructor B"); 
} 

Nếu bạn không muốn sử dụng constructor mặc định, bạn có thể làm như thế này:

public BClass() 
{ 
    super (parameters); // now you will use different constructor from AClass 
         // compiler will not add here call to "super()" 
    System.out.println("Constructor B"); 
} 

Từ trang oracle: Nếu một constructor không gọi một constructor superclass một cách rõ ràng, trình biên dịch Java sẽ tự động chèn một lời gọi tới hàm tạo không đối số của lớp cha. Nếu lớp siêu không có hàm tạo không có đối số, bạn sẽ nhận được lỗi biên dịch. Object có một constructor như vậy, vì vậy nếu Object là superclass duy nhất, thì không có vấn đề gì cả.

+0

+1 để ghi rõ dòng ẩn "super()". Đây là một điểm nhầm lẫn đối với tôi khi tôi bắt đầu viết mã bằng Java. –