2017-02-12 31 views
6

Không hỏi về sự khác biệt giữa giao diện và lớp trừu tượng.Phương thức tĩnh và không có cùng tên trong lớp cha và giao diện thực hiện

Thành công đang hoạt động riêng lẻ, phải không?

interface Inter { 
    public void fun(); 
} 

abstract class Am { 
    public static void fun() { 
     System.out.println("Abc"); 
    } 
} 

public class Ov extends Am implements Inter { 
    public static void main(String[] args) { 
     Am.fun(); 
    } 
} 

Tại sao lại có xung đột?

+3

câu hỏi là gì? – shmosel

Trả lời

7

Một phương pháp static và không static không được có cùng tên trong cùng một class. Điều này là do bạn có thể truy cập cả phương thức static và không static bằng cách sử dụng tham chiếu và trình biên dịch sẽ không thể quyết định xem bạn có ý gọi phương thức static hoặc phương thức không static hay không.

Xét đoạn mã sau ví dụ:

Ov ov = new Ov(); 
ov.fun(); //compiler doesn't know whether to call the static or the non static fun method. 

Lý do tại sao Java có thể cho phép một phương pháp static được gọi là sử dụng một tài liệu tham khảo là cho phép các nhà phát triển để thay đổi một phương pháp static đến một phương pháp phi static liên tục .

2

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.** 
    } 
} 
+0

* Phương thức tĩnh có thể được gọi bằng một cá thể *. Không. Không có gì trong * Java * có thể được gọi bằng một cá thể. (Atleast không phải bởi lập trình viên) – CKing

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