Tìm hiểu Inner class trong Java
Static Nested Class là gì?
Trong Java, một Static Class được tạo bên trong một lớp thì được gọi là Static Nested Class. Nó có thể truy cập các thành viên dữ liệu và phương thức non-static. Ngoài ra, nó có thể được truy cập bởi tên của Outer Class.
Ví dụ Static Nested Class với phương thức ở dạng non-static
class OuterClassExample { static int example = 30; static class Inner { void printMessage() { System.out.println("Gia tri cua bien example la: " + example); } } public static void main(String args[]) { OuterClassExample.Inner obj = new OuterClassExample.Inner(); obj.printMessage(); } }
Chạy chương trình Java trên sẽ cho kết quả:
Gia tri cua bien example la: 30
Trong ví dụ này, bạn cần tạo instance của Static Nested Class bởi vì phương thức printMessage() là phương thức dạng non-static. Nhưng bạn không cần tạo đối tượng của Outer Class bởi vì Nested Class là dạng static và các thuộc tính, phương thức hoặc các lớp cũng có thể được truy cập mà không cần sử dụng đối tượng.
Ví dụ Static Nested Class với phương thức ở dạng static
Nếu bạn có các thành viên static bên trong Static Nested Class, thì bạn không cần tạo instance của Static Nested Class mà vẫn có thể truy cập được các thành viên đó. Dưới đây là ví dụ:
class OuterClassExample { static int example = 30; static class Inner { static void printMessage() { System.out.println("Gia tri cua bien example la: " + example); } } public static void main(String args[]) { OuterClassExample.Inner.printMessage();// khong can tao instance cua static nested class } }
Nó sẽ cho kết quả sau:
Gia tri cua bien example la: 30
Bài viết đề cập đến một vấn đề rất cơ bản trong java đó là Nested class. Vậy nó là gì ? Và khi nào thì nên sử dụng ? Tất cả sẽ được giải thích trong nội dung dưới đây.
Nested class là một class được khai báo bên trong một class khác, như kiểu:
class OuterClass {
class InnerClass {
... implment something ....
}
}
Nested class được phân chia thành 2 loại: static nested classes và non-static nested classes.
- Static Nested Classes: là class được khai báo dạng static bên trong một class khác, cú pháp khai bao như sau:
class OuterClass {
class StaticInnerClass {
... implment something ....
}
}
Cú pháp để sử dung: OuterClass.StaticInnerClass nestedObject = new OuterClass.StaticInnerClass();
- Non-static Nested Classes: bao gồm Innser classes, Local classes and Anonymous Classes.
- Inner Classes: là khai bao một class không phải dạng static bên trong một class khác.
public class OuterClass {
class InnerClass {
... implment something ....
}
}
Cú pháp sử dụng: InnerClass nestedObject = new OuterClass.new InnerClass();
- Local Classes là khai báo một class bên trong một method khác. Ví dụ
public class OuterClass {
public String sayHello(String name) {
int cnt = 0; //Before Java 8 must be define like: final int cnt = 0;
class WelcomeMessage {
WelcomeMessage(){
System.out.println(cnt); //Only use, can't change
}
String getMessage() {
return "Welcome";
}
void showName(){//Only valid from Java 8
System.out.println(name);
}
}
WelcomeMessage msg = new WelcomeMessage();
return msg.getMessage() + " " + name + " to the Java world !";
}
public static void main(String[] args) {
System.out.println(new OuterClass().sayHello("John"));
}
}
*) Một số chú ý với Local classes:
- Local classes chỉ có thể được sử dụng trong pham vi method định nghĩa ra nó.
- Bên trong một Local classes chỉ có thể truy cập được các biến của OuterClass nếu nó là static.
- Từ Java 8 trở đi, bên trong Local classes có thể truy cập được đến giá trị của tham số trong method (hàm showName có thể sử dụng giá trị của tham số name)
- Các biến khia báo bên trong method khi sử dụng bên trong Local classes có tính chất final, nghĩa là ta chỉ có thể sử dụng mà không thể thay đổi được gia trị của nó.
- Anonymous Classes là class giống như Inner classes và Local classes, nó được khai bao bên trong class hoặc method mà không có tên cụ thể. Đây là cách implment 1 interface hoặc abstract class mà không cần phải khai báo một class nào cụ thể.
public class OuterClass {
interface Person {
String getName();
}
public void hello(){
Person john = new Person(){
@Override
public String getName() {
return "Johnny";
}
};
System.out.println(john.getName());
}
public static void main(String[] args) {
new OuterClass().hello();
}
}
*) Chú ý: pham vi truy cập biến của Anonymous class cũng giống với Local class.
Trên đây là các loại Nested classes. Vậy tại sao cần sử dụng chúng ? Chúng ta chỉ nên sử dụng chúng trong các trường hợp sau:
- Muốn nhóm các class nhỏ có liên quan với nhau vào chung 1 class lớn, như vậy dễ quản lý và sửa đổi code hơn.
- Một class chỉ được sử dụng trong phạm vi nhỏ
- Tăng tính đóng gói của đối tượng. Ta có thể sử dụng các keyword private, protected, public với nested classes.
Nhận xét
Đăng nhận xét