2014-10-23 35 views
25

Tại sao giao diện cho phép có phương thức main trong Java 8?Tại sao giao diện trong Java-8 được phép có phương pháp chính?

Như đã nêu trong mã bên dưới, nó hoạt động tốt và tạo ra đầu ra đúng cách.

public interface Temp { 
    public static void main(String args[]){ 
     System.out.println("Hello"); 
    } 
} 

OUTPUT (Sau khi chạy Temp.java)

Hello 

Vì vậy, sự khác biệt giữa phương pháp chính của interfaceclass là gì?

Hiện nay nó là hành xử như một lớp học và tôi đã thực hiện interface với phương pháp chính.

Tại sao chúng ta cần điều này?


EDIT

Thêm nhiều đến câu hỏi hiện, từ những nhận xét được nêu dưới đây (Tác giả Brian Goetz)

nên chúng tôi đã không cho phép một cách rõ ràng main phương pháp hiện tại là static phương pháp được cho phép trong interfaces (hay tương đương, loại trừ 'interface classes' như mục tiêu cho các phóng java.)


+7

Tôi nghĩ bạn có câu hỏi ngược. Câu hỏi không phải là "nên cho phép phương thức chính", nó là "chúng ta nên không cho phép các phương thức chính bây giờ mà các phương thức tĩnh được phép trong các giao diện" (hoặc, tương đương, loại trừ các lớp giao diện làm đích cho trình khởi chạy java). đã thêm * quy tắc phụ * chỉ để loại trừ một số thứ mà một số người nhận thấy là lạ (nhưng không nguy hiểm) - và đó là trò chơi thua cuộc. Bạn muốn xác định một số quy tắc mới khi bạn có thể hợp lý - bởi vì nếu không bạn sẽ bị méo mó vì phức tạp. –

+0

@BrianGoetz Có đồng ý !! Tôi đang tìm kiếm điều tương tự như tôi đã thể hiện nó với đầu ra và mối quan tâm của tôi là, tại sao chúng ta có một giao diện thực sự hoạt động giống như một lớp và Java có thể thực thi phương thức chính của _interface_.At giao diện kết thúc thực sự là một lớp và java không thể phân biệt giữa chính của giao diện và lớp. –

+4

Giao diện * là * loại lớp và luôn có. Chúng có một số giá trị mặc định khác nhau (các phương thức công khai và trừu tượng) và một số hạn chế khác nhau. Trong Java 8, chúng tôi đã loại bỏ một số hạn chế - chẳng hạn như hạn chế đối với các phương thức tĩnh. Chúng tôi sẽ không đưa ra một quy tắc đặc biệt để loại bỏ một phương pháp tĩnh cụ thể chỉ vì nó có vẻ kỳ lạ lúc đầu với một vài người. Khi bạn thực sự hiểu các quy tắc mới, điều này sẽ không có vẻ lạ - thực tế, hạn chế bạn đề xuất sẽ có vẻ lạ. –

Trả lời

29

Kể từ Java 8, phương pháp tĩnh được phép trong giao diện.

main() là phương pháp tĩnh.

Do đó, chính() được cho phép trong giao diện.

Chúng tôi không cần điều này, vì nó không được phép trước, nhưng chúng tôi vẫn sống sót. Nhưng vì các phương thức tĩnh, theo định nghĩa, không bị ràng buộc với một cá thể của một lớp, mà là với chính lớp đó, nó có ý nghĩa để cho phép chúng trong các giao diện. Nó cho phép xác định các phương thức tiện ích liên quan đến một giao diện (ví dụ như các phương thức được tìm thấy trong ví dụ Collections), trong chính giao diện, chứ không phải là một lớp riêng biệt).

Không có sự khác biệt giữa phương pháp tĩnh lớp và phương thức tĩnh giao diện.

+3

Có ít nhất một khác biệt nhỏ giữa các phương thức tĩnh trên các lớp và giao diện: các phương thức tĩnh trên các lớp có thể được "kế thừa" bởi các lớp con nhưng các phương thức tĩnh trên các giao diện không được thừa kế bởi bất kỳ kiểu con nào. –

+4

@StuartMarks, sự thừa kế của các phương thức tĩnh chỉ là một phép thuật trình biên dịch như khai báo cùng một phương thức với cùng một chữ ký sẽ làm bóng phương thức tĩnh trong lớp siêu. Trong mã byte, các phương thức tĩnh chỉ được gọi thông qua lời gọi đầy đủ về phương thức lớp +. – bestsss

+0

@bestsss: điều này không đúng. Các phương thức 'static' * được thừa hưởng và trình biên dịch sẽ sử dụng loại mục tiêu chính thức được tìm thấy trong mã nguồn, được giải quyết (một lần nữa) khi chạy. Lệnh gọi chứa tham chiếu đến một phương thức + class, nhưng nó cũng áp dụng cho các lời gọi phương thức ảo. Điểm mấu chốt là khai báo phương thức thực tế không nhất thiết phải nằm trong lớp được chỉ định, nhưng có thể nằm trong một siêu lớp. Xem https://ideone.com/n9Caa2 (và về cơ bản là khác với phương thức 'tĩnh' trong giao diện)… – Holger

6

Trong Java 8, một giao diện có thể có các phương thức tĩnh. Vì phương thức chính cũng là một phương thức tĩnh, nó sẽ cho phép nó.

Chúng tôi có thể khai báo các phương thức trợ giúp chung bằng cách sử dụng các phương pháp tĩnh này.

9

Tôi xếp thứ hai câu trả lời của @ jb-nizet.Không có "nhu cầu riêng biệt" cho việc này, nhưng nó loại bỏ một hạn chế không cần thiết. Ví dụ. một ví dụ là, rằng bây giờ bạn có thể khai báo một phương pháp nhà máy trong giao diện:

public interface SomeService { 

    public static SomeService getInstance() { 
    // e.g. resolve via service provider interface 
    } 

    ... 

} 

Trước Java 8 chúng tôi cần luôn luôn là một lớp nhà máy riêng biệt. Một ví dụ yêu thích là API công cụ ứng dụng của Google.

+3

Vì vậy, việc sử dụng chính đáng một phương pháp chính trên giao diện sẽ là để gọi factiry để lấy một đối tượng, sau đó ủy quyền cho đối tượng đó để thực hiện hoạt động của chương trình. – Raedwald

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