In recent Java versions, particularly from Java 8 onwards, default methods were introduced to interfaces. This feature allows developers to add new methods to interfaces without breaking the existing implementations. Default methods provide a way to extend interfaces while maintaining backward compatibility, making it easier to enhance APIs.
Prior to Java 8, any change to an interface would require all implementing classes to provide an implementation for the new methods. However, with the introduction of default methods, an interface can now offer a default behavior that implementing classes can either use or override.
// Example of a default method in an interface
interface Animal {
// A default method
default void makeSound() {
System.out.println("Some sound");
}
}
class Dog implements Animal {
// Overrides the default method
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // Outputs: Bark
}
}
How do I avoid rehashing overhead with std::set in multithreaded code?
How do I find elements with custom comparators with std::set for embedded targets?
How do I erase elements while iterating with std::set for embedded targets?
How do I provide stable iteration order with std::unordered_map for large datasets?
How do I reserve capacity ahead of time with std::unordered_map for large datasets?
How do I erase elements while iterating with std::unordered_map in multithreaded code?
How do I provide stable iteration order with std::map for embedded targets?
How do I provide stable iteration order with std::map in multithreaded code?
How do I avoid rehashing overhead with std::map in performance-sensitive code?
How do I merge two containers efficiently with std::map for embedded targets?