2012-12-04 15 views
10

Tôi có một câu hỏi về mã này ngay tại đâyPolymorphism và tĩnh Phương pháp

public Car { 
    public static void m1(){ 
     System.out.println("a"); 
    } 
    public void m2(){ 
     System.out.println("b"); 
    } 
} 

class Mini extends Car { 
    public static void m1() { 
     System.out.println("c"); 
    } 
    public void m2(){ 
     System.out.println("d"); 
    } 
    public static void main(String args[]) { 
     Car c = new Mini(); 
     c.m1(); 
     c.m2();  
    } 
} 

Tôi biết đa hình đó không làm việc với các phương pháp tĩnh, chỉ với các phương pháp dụ. Và việc ghi đè đó cũng không hoạt động đối với các phương thức tĩnh.

Vì vậy, tôi nghĩ rằng chương trình này nên in ra: c, d

Bởi vì c gọi phương thức m1, nhưng nó tĩnh, vì vậy nó không thể ghi đè và nó gọi phương thức trong lớp Mini thay vì xe.

Điều này có đúng không?

Tuy nhiên, sách giáo khoa của tôi nói rằng câu trả lời phải là: a, d

có phải là lỗi đánh máy không? Bởi vì tôi hơi bối rối ngay bây giờ.

Hãy làm rõ điều này, cảm ơn.

Trả lời

26

Vì c gọi phương thức m1, nhưng nó tĩnh nên không thể ghi đè và gọi phương thức trong lớp Mini thay vì Ô tô.

Đó chính xác là ngược.

ctuyên bố như Car, các cuộc gọi phương pháp để tĩnh thực hiện thông qua c sẽ gọi các phương thức được định nghĩa bởi Car.
Trình biên dịch biên dịch c.m1() trực tiếp đến Car.m1(), mà không biết rằng c thực sự nắm giữ Mini.

Đây là lý do tại sao bạn không bao giờ nên gọi phương thức tĩnh thông qua trường hợp như vậy.

+4

+1 Đối với * Đây là lý do tại sao bạn không bao giờ nên gọi phương thức tĩnh thông qua trường hợp như vậy. * – Joffrey