Chúng ta phải viết mã của chúng tôi để nó là cú pháp khôn ngoan chính xác. Cũng không kém phần quan trọng là phải hiểu rằng mã của chúng tôi không đặt bất kỳ sự mơ hồ nào cho trình biên dịch. Trong trường hợp chúng tôi có bất kỳ sự mơ hồ nào như vậy, các nhà thiết kế ngôn ngữ đã cẩn thận để không cho phép mã đó biên dịch.
Lớp học kế thừa các hành vi từ lớp siêu của nó. Phương pháp tĩnh có thể được truy cập từ đơn giản bằng cách sử dụng tên lớp và cũng từ ví dụ. Giả sử có phương thức có cùng tên và chữ ký (ngoại trừ từ khóa static
), hãy gọi phương thức trên cá thể sẽ rời khỏi trình biên dịch để tìm kiếm. Làm thế nào nó sẽ quyết định những gì các lập trình viên có ý định làm, whcih của hai phương pháp người đó có ý định gọi? Do đó các nhà thiết kế ngôn ngữ quyết định có trường hợp này dẫn đến một lỗi biên dịch.
Theo
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2
Nếu một lớp C tuyên bố hoặc được thừa hưởng một phương pháp m tĩnh, sau đó 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 C mà nếu không sẽ có thể truy cập để mã trong C. Đó là một lỗi thời gian biên dịch nếu một phương pháp tĩnh ẩn một phương pháp thể hiện.
public class Ov extends Am implements Inter {
public static void main(String[] args) {
Ov.fun(); //static method is intended to call, fun is allowed to be invoked from sub class.
Ov obj = new Ov();
obj.fun(); //** now this is ambiguity, static method can
//be invoked using an instance, but as there is
//an instance method also hence this line is ambiguous and hence this scenario results in compile time error.**
}
}
Nguồn
2017-02-12 08:28:09
câu hỏi là gì? – shmosel