Difference Between interface and @interface in Java
In Java, interface and @interface are two distinct constructs with unique purposes. Here’s a concise breakdown of their differences, characteristics, and examples to illustrate their use cases.
interface in Java
The interface keyword is used to define an interface, which acts as a contract for classes. An interface specifies what methods a class must implement, but it does not provide implementations for those methods.
Key Characteristics:
- Abstract Methods: Contains abstract methods (without bodies) and, from Java 8 onward, can include default and static methods with implementations.
- Multiple Inheritance: Supports multiple inheritance, allowing a class to implement multiple interfaces.
- Constants: Fields in interfaces are implicitly
public,static, andfinal. - No Constructors: Interfaces cannot be instantiated directly.
Example:
// Define an interface
interface Animal {
// Abstract method
void makeSound();
// Default method with implementation (Java 8+)
default void eat() {
System.out.println("This animal eats food.");
}
// Static method with implementation (Java 8+)
static void breathe() {
System.out.println("Breathing...");
}
}
// Implement the interface in a class
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // Outputs: Woof!
dog.eat(); // Outputs: This animal eats food.
Animal.breathe(); // Outputs: Breathing...
}
}
@interface in Java
The @interface keyword is used to define a custom annotation type, which provides a way to attach metadata to Java code. Annotations are often used to provide information to the compiler or runtime processing tools.
Key Characteristics:
- Annotation Members: Annotations can have elements, declared similarly to methods, that can have default values.
- No Method Bodies: Unlike interfaces, annotation elements do not have bodies.
- Metadata Purpose: Primarily used for metadata purposes and can be processed at compile time or runtime.
Example:
// Define a custom annotation
@interface MyAnnotation {
String value(); // Annotation element
int count() default 1; // Annotation element with a default value
}
// Use the custom annotation
@MyAnnotation(value = "Example", count = 5)
class ExampleClass {
// Annotate a method
@MyAnnotation("MethodLevel")
public void annotatedMethod() {
System.out.println("This method is annotated.");
}
}
public class Main {
public static void main(String[] args) {
ExampleClass example = new ExampleClass();
example.annotatedMethod();
// Access annotation using reflection
MyAnnotation classAnnotation = ExampleClass.class.getAnnotation(MyAnnotation.class);
if (classAnnotation != null) {
System.out.println("Class annotation value: " + classAnnotation.value());
System.out.println("Class annotation count: " + classAnnotation.count());
}
}
}
Differences
- Purpose:
interfaceis used to define behavior contracts with abstract methods, while@interfaceis for creating custom annotations to add metadata. - Usage:
interfaceis implemented by classes, whereas@interfaceis used to declare annotations applicable to classes, methods, fields, etc. - Syntax and Structure: Interfaces contain methods (abstract or with bodies since Java 8) and constants, while annotations contain elements that define the data they can hold.
These differences highlight the distinct roles that interface and @interface play in Java, with interface providing a blueprint for classes and @interface offering a way to associate metadata with program elements.
