Who là gì class là gì

Trong lập trình, hẳn không ít lần bạn sử dụng lớp lồng nhau (Inner Class) để nhóm các lớp và các interface lại một nơi nhằm giúp cho việc code trở nên dễ đọc và bảo trì nhanh chóng hơn. Vậy lớp lồng nhau (Inner Class) là gì? Và có các kiểu lớp lồng nhau nào trong Java. 

>> Khóa học lập trình cơ bản

>> Lập trình hướng đối tượng (bằng Java)

1. Lớp lồng nhau (Inner Class) là gì?

Lớp lồng nhau (Inner Class) là một lớp được khai báo trong lớp hoặc interface khác. 

Ngoài ra, bạn cũng có thể hiểu khái niệm này như sau: lớp bên trong là thành viên của lớp với thành viên là các biến và phương thức. Trong lớp lồng nhau, các lớp thành viên được gọi là lớp cấp cao nhất hoặc lớp ngoài. Một lớp cấp cao nhất có thể chứa bất kỳ số lượng các lớp bên trong.

Lớp lồng nhau trong JavaLớp lồng nhau trong Java

Cú pháp của inner class trong java: 

class Java_Outer_class{  

    //code  

    class Java_Inner_class{  

        //code  

    }  

}  

Lớp lồng nhau được chia làm hai loại chính là: tĩnh và không tĩnh. Trong đó, các lớp lồng nhau tĩnh được truy cập bằng cách sử dụng tên lớp kèm theo: OuterClass.StaticNestedClass. 

Để tạo một đối tượng cho lớp lồng nhau tĩnh, bạn có thể sử dụng cú pháp này:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

  • Để khởi tạo một lớp bên trong, bạn phải khởi tạo lớp bên ngoài với cú pháp này:

OuterClass outerObject = new OuterClass()

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

2. Các kiểu lớp lồng nhau trong Java

Có 4 kiểu lớp lồng nhau trong Java gồm: nested Inner Class, local Inner class, static Inner class và anonymous Inner class.

2.1. Nested Inner Class

Nested Inner Class nghĩa là lớp bên trong có thể truy cập các biến thể hiện khác của lớp bên ngoài, ngay cả khi chúng được khai báo là private. Bạn có thể sử dụng bất kỳ công cụ sửa đổi quyền truy cập nào cho lớp bên trong lồng nhau bao gồm: công khai, riêng tư, bảo vệ hoặc mặc định.

2.2. Local Inner class

Local Inner class là kiểu lớp lồng nhau cho phép bạn khai báo một lớp bên trong một thân phương thức sẽ thuộc kiểu cục bộ. 

Phạm vi của lớp bên trong sẽ bị hạn chế trong phương thức, tương tự như các biến cục bộ. Vậy nên, bạn chỉ có thể khởi tạo một lớp bên trong cục bộ bên trong phương thức mà lớp bên trong được định nghĩa. Chúng ta không thể khai báo Method Local Class là private, protected, static và transient nhưng lại có thể khai báo nó dưới dạng trừu tượng và cuối cùng, nhưng không phải cả hai cùng một lúc.

Local Inner ClassLocal Inner Class

2.3. Static Inner class

Static Inner class là một lớp lồng nhau tĩnh hoạt động như một thành viên tĩnh của lớp bên ngoài. Theo đó, bạn có thể truy cập nó mà không cần khởi tạo lớp bên ngoài với sự trợ giúp của phương thức tĩnh.

Về mặt kỹ thuật, các lớp Static Inner không phải là một lớp lồng nhau trong Java. Tương tự như các thành viên tĩnh, một lớp lồng nhau tĩnh không thể truy cập các biến cá thể và phương thức của lớp bên ngoài.

2.4. Anonymous Inner class

Anonymous Inner class là lớp lồng nhau mang tính ẩn danh, có thể hiểu là  lớp bên trong được khai báo mà không có tên. Nhờ vậy, mà bạn có thể tạo mã ngắn gọn hơn. 

Nói chung, chúng được sử dụng khi có nhu cầu ghi đè phương thức của một lớp hoặc một giao diện. Ngoài ra, bạn cũng có thể sử dụng chúng nếu bạn chỉ cần sử dụng một lớp cục bộ một lần. Chúng tương tự như các lớp bên trong cục bộ nhưng không có tên.

Bài viết trên đây, FUNiX đã giới thiệu đến bạn các kiến thức về lớp lồng nhau (Inner Class) là gì? Các kiểu của lớp lồng nhau trong Java. Hy vọng, nội dung này sẽ mang lại hữu ích cho bạn. Đặc biệt, đừng quên tham khảo các khóa học lập trình tại funix.edu.vn để nhanh chóng trở thành một lập trình viên chuyên nghiệp nhé!

Sự khác nhau giữa Interface và Abstraction Class là gì? Cách phân biệt ra sao? Bài viết này sẽ giải đáp những vấn đề này để bạn có thể lựa chọn cách làm phù hợp nhất cho mỗi trường hợp trong lập trình.

Nếu bạn đã tìm hiểu về lập trình Java, chắc hẳn bạn sẽ biết đến hai khái niệm Interface và Abstraction Class. Nhưng liệu bạn đã biết rõ về công dụng và lợi ích của Abstract và Interface ? Hay sự khác nhau giữa chúng và cách phân biệt ra sao? 

1. Khái quát về Interface và Abstraction Class

Interface (hay giao diện) là một kiểu dữ liệu tham chiếu chỉ chứa hằng số và tên các phương thức, không có phần phương thức trừu tượng tương tự với class (lớp). Tuy nhiên, class thường thể hiện các thuộc tính và hành động của đối tượng, còn Interface thể hiện các hành động của lớp đó. Cũng giống với các lớp, interface không thể được khởi tạo mà chỉ có thể mở rộng hoặc kế thừa từ các Interface khác.

Tính trừu tượng là một tiến trình làm ẩn các trình triển khai và chỉ hiển thị các tính năng quan trọng tới người dùng. Ví dụ: để gửi tin nhắn, người dùng chỉ cần soạn và gửi tin mà không hề biết tiến trình xử lý nội tại triển khai tin nhắn đó như thế nào. Nói cách khác, tính trừu tượng giúp bạn chú ý vào đối tượng thay vì quan tâm đến cách nó thực hiện.

Abstraction Class (AC) được hiểu là một lớp trừu tượng trong Java. AC trong trong Java có thể có các phương thức trừu tượng và không trừu tượng (phương thức với phần thân). Đặc biệt, nó không thể được khởi tạo mà cần kế thừa và tự triển khai phương thức.

Abstraction Class trong JavaAbstraction Class trong Java

2. Phân biệt Interface và lớp trừu tượng (Abstraction Class) 

Cả Interface và Abstraction class đều giống nhau ở điểm có thể chứa phương thức thuần ảo và không thể khởi tạo đối tượng. Tuy nhiên, điểm khác biệt cơ bản của Interface và Abstraction Class như sau:

Abstract class

Interface

Có các phương thức trừu tượng và không trừu tượng

Chỉ có duy nhất phương thức trừu tượng

Không hỗ trợ đa kế thừa

Hỗ trợ đa kế thừa

Có thể tồn tại các biến final và non-final, static và non-static

Chỉ có các biến static và final

Có thể extents (kế thừa) interface

Không thể kế thừa lớp abstract

Sử dụng từ khóa “abstract” để khai báo lớp trừu tượng

Sử dụng từ khóa “interface” để khai báo giao diện

Một lớp trừu tượng có thể extents một lớp Java khác và thực hiện nhiều interface khác nhau

Một interface chỉ có thể implements (cài đặt) nhiều interface khác

Có thể kế thừa bằng cách sử dụng từ khóa “extends”

Các lớp triển khai interface bằng cách sử dụng từ khóa “implements”

Một lớp trừu tượng có phạm vi truy cập ở dạng private, protected,…

Các phương thức, property của interface đều được mặc định ở dạng public

Có thể định nghĩa thân phương thức và property.

Chỉ có thể khai báo, không thể định nghĩa code xử lý.

3. Khi nào bạn nên dùng Interface và Abstraction Class?

Phân biệt Interface và Abstraction ClassInterface giúp bạn cụ thể hóa hành vi của một loại dữ liệu cụ thể, còn Abstraction Class giúp bạn chia sẻ code giữa các lớp có liên quan

Bạn nên sử dụng Interface trong các trường hợp như:

  • Bạn muốn cụ thể hóa hành vi của một loại dữ liệu cụ thể nhưng không bận tâm rằng ai sẽ triển khai hành vi đó.
  • Bạn muốn sử dụng nhiều loại kế thừa. 
  • Cần cung cấp các chức năng chung cho các lớp khác nhau. Ví dụ: Interface Comparable và Cloneable.
  • Cần tổng hợp các đối tượng dựa trên các hành vi phổ biến.
  • Bạn muốn sử dụng đa hình vì một lớp có thể thực hiện nhiều interfaces.
  • Cần tạo nên các thành phần (components) được kết nối rời rạc, dễ bảo trì và dùng chúng như 1 plugin vì việc implements cho interface được tách biệt với nó.

Đối với Abstraction Class, bạn có thể cân nhắc sử dụng trong những trường hợp:

  • Bạn cần cung cấp các phương thức mặc định hay các phương thức phổ biến mà nhiều lớp dẫn xuất có thể triển khai.
  • Cần tạo ra nhiều phiên bản với các thành phần (components). Bạn có thể bổ sung thêm các thuộc tính và phương thức vào Abstraction Class với các lớp kế thừa được cập nhật với tự động.
  • Bạn muốn chia sẻ code giữa các lớp có liên quan.
  • Bạn mong muốn những lớp trừu tượng extend có chung nhiều trường/method hoặc yêu cầu truy cập bộ điều chỉnh thay vì public nó. 

Bài viết trên đã giải đáp các vấn đề về Interface và Abstraction Class cũng những điểm khác biệt giữa hai phương thức này. FUNiX hy vọng qua bài viết này, bạn đọc sẽ có một cái nhìn rõ hơn về Interface, Abstract Class. Nếu bạn có bất kỳ đóng góp gì, đừng quên để lại bình luận ở dưới đây.