Sự khác biệt giữa giao diện và @interface trong java là gì?


306

Tôi đã không chạm vào Java kể từ khi sử dụng JBuilder vào cuối những năm 90 tại Đại học, vì vậy tôi hơi lạc lõng - với bất kỳ giá nào tôi đã làm việc trên một dự án Java nhỏ trong tuần này và sử dụng Intellij IDEA làm IDE của tôi , để thay đổi tốc độ từ sự phát triển .Net thường xuyên của tôi.

Tôi nhận thấy nó có hỗ trợ thêm giao diện và @interfaces, @interface là gì và nó khác với giao diện bình thường như thế nào?

public interface Test {
}

so với

public @interface Test {
}

Tôi đã thực hiện một chút tìm kiếm, nhưng không thể tìm thấy rất nhiều thông tin hữu ích đề cập đến @interface.

Câu trả lời:


322

Các @ biểu tượng biểu thị một định nghĩa kiểu chú thích.

Điều đó có nghĩa là nó không thực sự là một giao diện, mà là một loại chú thích mới - được sử dụng như một công cụ sửa đổi chức năng, chẳng hạn như @override .

Xem mục javadocs này về chủ đề.


7
Cảm ơn rất nhiều, thật tốt khi biết. Vì vậy, lý do để gọi nó là @interface, thay vì nói @annotation tôi tự hỏi .. có vẻ như là một thuật ngữ quá tải không cần thiết.
Bittercoder

5
Hướng dẫn và JLS ám chỉ một chú thích là một loại giao diện đặc biệt. Có vẻ như không có nhiều thảo luận về chủ đề này, nhưng javarunner.blogspot.com/2005/01/annotations-in-java-15.html giải thích rằng các chú thích là một phần mở rộng ngầm của giao diện Chú thích và @ và giao diện được sử dụng để cùng phân biệt với một giao diện thông thường. Bạn cũng có thể muốn đọc đặc tả JSR cho các chú thích.
DavidValeri

1
@Bittercoder các tài liệu có đề cập: "giao diện từ khóa được bắt đầu bằng dấu tại (@) (@ = AT, như trong loại chú thích)". Đó là tất cả các lý do tôi có thể tìm thấy đặt tên wrt.
Shaishav

112

giao diện:

Nói chung, một giao diện hiển thị hợp đồng mà không tiết lộ các chi tiết triển khai cơ bản. Trong lập trình hướng đối tượng, các giao diện xác định các kiểu trừu tượng phơi bày hành vi, nhưng không chứa logic. Việc thực hiện được xác định bởi lớp hoặc loại thực hiện giao diện.

@interface: (Loại chú thích)

Lấy ví dụ dưới đây, trong đó có rất nhiều ý kiến:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

Thay vì điều này, bạn có thể khai báo một loại chú thích

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

sau đó có thể chú thích một lớp như sau:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: Nhiều chú thích thay thế các bình luận trong mã.

Tham khảo: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html


11
lời giải thích hay
Pat B

2
Điều đó thực sự hữu ích. Tôi không biết Java có thể làm điều này.
Jay Sidri

Câu trả lời trước bao gồm liên kết này là nơi mà thông tin này đến từ. Tôi thấy nó hữu ích để tìm thêm thông tin về chủ đề này. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
Một trong những câu trả lời hay nhất và đầy đủ (chưa rõ ràng) tôi đã được chứng kiến ​​trên stackoverflow.
Ông D

32

Các interfacetừ khóa chỉ ra rằng bạn đang khai báo một lớp giao diện truyền thống trong Java.
Các @interfacetừ khóa được sử dụng để khai báo một kiểu chú thích mới.

Xem hướng dẫn docs.oracle về chú thích để biết mô tả về cú pháp.
Xem JLS nếu bạn thực sự muốn tìm hiểu chi tiết về ý @interfacenghĩa của nó.


18

interface: định nghĩa hợp đồng cho một lớp thực hiện nó

@interface: xác định hợp đồng cho một chú thích


8

giao diện trong ngôn ngữ lập trình Java là một kiểu trừu tượng được sử dụng để chỉ định một hành vi mà các lớp phải thực hiện. Chúng tương tự như các giao thức. Các giao diện được khai báo bằng từ khóa giao diện

@interface được sử dụng để tạo các chú thích Java (tùy chỉnh) của riêng bạn. Các chú thích được định nghĩa trong tệp riêng của chúng, giống như một lớp hoặc giao diện Java. Dưới đây là ví dụ chú thích Java tùy chỉnh:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

Ví dụ này định nghĩa một chú thích gọi là MyAnnotation có bốn phần tử. Lưu ý từ khóa @interface. Điều này báo hiệu cho trình biên dịch Java rằng đây là định nghĩa chú thích Java.

Lưu ý rằng mỗi phần tử được định nghĩa tương tự như một định nghĩa phương thức trong một giao diện. Nó có một kiểu dữ liệu và tên. Bạn có thể sử dụng tất cả các kiểu dữ liệu nguyên thủy làm kiểu dữ liệu phần tử. Bạn cũng có thể sử dụng mảng như kiểu dữ liệu. Bạn không thể sử dụng các đối tượng phức tạp làm kiểu dữ liệu.

Để sử dụng chú thích trên, bạn có thể sử dụng mã như thế này:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

Tham khảo - http://tutorials.jenkov.com/java/annotations.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.