2010-07-15 35 views
6

Tôi muốn biết lý do tại sao điều này là lần đầu tiên cho phép trong Java (hoặc oops nói chung) Tôi nhớ rằng các phương pháp tĩnh là chung cho cả hai cha mẹ và con lớpĐịnh nghĩa lại phương pháp tĩnh trong lớp con

public class Redefine extends Parent{ 
    public static void test() { 

    } 
} 


class Parent{ 
    public static void test() { 

    } 
} 

Q1: Vì ghi đè không được hỗ trợ cho các phương pháp tĩnh, làm thế nào cả hai classe có cùng phương pháp?

Q2: Nếu thay đổi phương thức tĩnh để ném ngoại lệ không được xác định thì không biên dịch. tại sao lại như vậy. Rõ ràng nó không quan trọng vì vậy tôi nên được phép ném ngoại lệ mới phải không?

public class Redefine extends Parent{ 
    public static void test() throws Exception{ 

    } 
} 

Trả lời

10

A1:: static phương pháp là mỗi lớp. Chúng không liên quan gì tới các hệ thống phân cấp thừa kế về mặt đa hình. Vì vậy, gọi số Parent.test() sẽ gọi phương thức gốc, trong khi gọi số Redefine.test() sẽ gọi cho trẻ.

A2:JLS 8.4.8 viết:

Nếu một lớp khai báo một phương pháp m tĩnh, sau đó tuyên bố m được cho là ẩn bất kỳ phương pháp m', nơi mà các chữ ký của m là một subsignature (§8.4 .2) của chữ ký của m ', trong các siêu lớp và siêu kết nối của lớp mà nếu không sẽ có thể truy cập được mã trong lớp.

Tuyên bố phương pháp không được có điều khoản ném xung đột (§8.4.6) với điều khoản của bất kỳ phương pháp nào nó ghi đè hoặc ẩn; nếu không, một lỗi biên dịch sẽ xảy ra.

0

Q1: Phương pháp tĩnh không bị ghi đè, vì vậy đây là hai phương pháp khác nhau có cùng chữ ký. Một được gọi với Parent.test(), tên kia được gọi với Redefine.test()

Q2: Phương pháp của bạn có vẻ hợp lệ. lỗi gì bạn nhận được?

+1

lại: Q2: Nếu bạn thử phiên bản OP của Redefine.test() được khai báo là 'ném ngoại lệ 'thì bạn sẽ gặp lỗi trình biên dịch Ngoại lệ ngoại lệ không tương thích với mệnh đề ném trong Parent.test()' . – mikej

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