Trong thế giới sinh vật thì các thế hệ con cái kế thừa các đặc điểm tính chất của cha mẹ là điều hết sức hiển nhiên hay việc con người có thể xây dựng nên các bộ khung hoặc biểu mẫu để có thể tái sử dụng nhiều lần nhờ đó mà có thể tiết kiệm được thời gian và tiền bạc trong sản xuất. Trong lập trình hướng đối tượng thì việc kế thừa được định nghĩa và thể hiện như là các interface
và class abstract
.
1. Interface
Interface là bản thiết kế của một lớp. Nó có các hằng số tĩnh và phương thức trừu tượng.
interface { // declare constant fields // declare methods that abstract // by default. // static method }
– Ví dụ:
public interface SampleInterface { // constant fields String name = "Tây Java"; // abstract methods void method1(); int method2(); String methodN(); // default method default void sayHello() { System.out.println("Đây là sample interface"); } // static method static String getCurrentTime(){ return String.valueOf(LocalDate.now()); } }
2. Tại sao sử dụng Interface ?
Có ba lý do chính để sử dụng Interface như sau:
- Interface được sử dụng để đạt được sự trừu tượng.
- Theo Interface, chúng ta có thể hỗ trợ khả năng đa kế thừa.
- Có thể được sử dụng để đạt được sự kết hợp lỏng lẻo.
3. Mối quan hệ giữa các class và các interface
Java đưa tính kế thừa vào trong lập trình hướng đối tượng thông qua 2 từ khoá là extends và implement để thể hiện việc kế thừa giữa các class và interface.
Như hình thể hiện phía trên một class extends từ một class khác, một interface extends từ một interface khác, Nhưng một class thì implements(triển khai/thực hiện) một interface khác.
4. Đa kế thừa trong Java
Một interface có thể extends từ nhiều interface khác.
– Cú pháp:
class extends <ClassName>
– Ví dụ:
// Super interface public interface BaseService { default void printMessage() { System.out.println("Default message from BaseService"); } } // Super interface public interface LogService { void saveLog(); void printLog(); } // Sub interface public interface UserService extends BaseService, LogService { int addUser(User user); void updateUser(User userId); void deleteUser(long userId); }
Một class có thể implements từ nhiều interface.
– Cú pháp:
class implements <InterfaceName>
– Ví dụ:
// class UserServiceImpl implements (thực thi) interface UserService và CommonService public class UserServiceImpl implements UserService, CommonService { @Override public int addUser(User user) { System.out.println("-----[ addUser ]-----"); return 0; } @Override public void updateUser(User userId) { System.out.println("-----[ updateUser ]-----"); } @Override public void deleteUser(long userId) { System.out.println("-----[ deleteUser ]-----"); } @Override public void saveLog() { System.out.println("-----[ saveLog ]-----"); } @Override public void printLog() { System.out.println("-----[ printLog ]-----"); } @Override public void connectDB() { System.out.println("-----[ connectDB ]-----"); } }
5. Các kiểu kế thừa trong Java
– Single
– Multiple Level
– Hierarchical
– Multiple
– Hybrid
6. Câu hỏi phỏng vấn Interface
1. Interface là gì trong Java?
Interface là một kiểu dữ liệu trừu tượng trong Java, nó định nghĩa các phương thức mà một lớp phải triển khai. Interface cho phép tính đa hình, cho phép một lớp thực thi nhiều interface cùng lúc.
2. Sự khác biệt giữa Abstract Class và Interface là gì?
- Abstract Class có thể chứa cả abstract method và non-abstract method, trong khi Interface chỉ chứa các abstract method (trước Java 8).
- Abstract Class hỗ trợ khai báo các biến, còn interface thì không.
- Một lớp chỉ có thể kế thừa một abstract class nhưng có thể thực thi(implements) nhiều interface.
3. Làm thế nào để triển khai nhiều interface trong một class?
Trong Java, một lớp có thể implement nhiều interface bằng cách sử dụng từ khóa implements
và phân cách các interface bằng dấu phẩy,
public class MyClass implements Interface1, Interface2 { // Override methods from both interfaces }
4. Java 8 có gì mới về interface?
Từ Java 8, interface có thể chứa default methods và static methods. Default methods cho phép cung cấp cài đặt mặc định cho một số phương thức mà không cần tất cả các lớp thực thi phải override nó.
5. Functional Interface là gì?
Functional Interface là interface chỉ chứa một phương thức trừu tượng duy nhất. Nó có thể được sử dụng với các biểu thức lambda. Một ví dụ là Runnable
hoặc bạn có thể sử dụng annotation @FunctionalInterface
để đảm bảo một interface chỉ chứa duy nhất một phương thức trừu tượng.
6. Lợi ích của việc sử dụng interface trong Spring Boot?
- Loose Coupling (Giảm sự phụ thuộc): Interface giúp tách biệt các thành phần, cho phép dễ dàng thay thế và bảo trì.
- Dependency Injection (DI): Spring sử dụng interface để quản lý các đối tượng bằng cách tiêm phụ thuộc, giúp các lớp dễ dàng kiểm soát hơn và ít bị phụ thuộc lẫn nhau.
7. Spring Boot sử dụng interface như thế nào trong DI?
- Trong Spring Boot, interface thường được sử dụng để khai báo các service. Sau đó, chúng ta có thể triển khai các interface này và sử dụng các annotation như
@Service
,@Component
để Spring quản lý đối tượng và tiêm phụ thuộc vào các class khác.