2012-05-01 13 views
10

Tôi là một Học sinh Java AP và tôi đang thực tập cho kỳ thi của mình. Tôi đã xem qua câu hỏi này và tôi không hiểu câu trả lời:Đa hình và Constructors

Hãy xem xét các loại sau đây:

public class A 
{ 
    public A() { methodOne(); } 

    public void methodOne() { System.out.print("A"); } 
} 

public class B extends A 
{ 
    public B() { System.out.print("*"); } 

    public void methodOne() { System.out.print("B"); } 
} 

đầu ra khi mã sau đây được thực hiện là gì:

A obj = new B(); 

Các đúng câu trả lời là B *. Ai đó có thể vui lòng giải thích cho tôi chuỗi các cuộc gọi phương thức?

+0

Thêm câu lệnh in vào hàm tạo của 'A' và nó có thể trở nên rõ ràng hơn. –

Trả lời

27

Trình tạo B được gọi. Hướng dẫn ngầm đầu tiên của hàm tạo B là super() (gọi hàm tạo mặc định của lớp siêu). Vì vậy, constructor của A được gọi. Nhà xây dựng của A gọi số super(), gọi hàm tạo java.lang.Object, không in bất cứ thứ gì. Sau đó, methodOne() được gọi. Vì đối tượng thuộc loại B, phiên bản methodOne của B được gọi và B được in. Sau đó, hàm tạo B tiếp tục thực hiện và * được in. Cần phải lưu ý rằng việc gọi một phương thức overridable từ một hàm tạo (như hàm tạo của A) là thực hành rất tồi: nó gọi một phương thức trên một đối tượng chưa được xây dựng.

+4

+1, đặc biệt là đối với bit thực hành không tốt. –

+0

Và, phương pháp được ghi đè có thể không hoạt động theo cách 'Lớp A' mong đợi nó. –

+0

Tôi không biết về cuộc gọi ngầm đến siêu(), cảm ơn! – user1104775

2

Lớp cơ sở phải được xây dựng trước lớp dẫn xuất.

Đầu tiên A() được gọi là cuộc gọi methodOne() in B.

Tiếp theo, B() được gọi là in *.