Java cho phép chúng ta có thể định nghĩa một class nằm trong một class khác, ví dụ như:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.javaexample; public class Application { class Builder { } } |
Class được định nghĩa bên trong một class khác, chúng ta gọi nó là nested class còn class khác này được gọi là outer class. Trong ví dụ của mình ở trên thì Builder là một nested class còn Application là một outer class. Nested class còn được chia thành 2 loại khác nhau là Non-static nested class và Static nested class. Cụ thể như thế nào? Trong bài viết này, chúng ta sẽ tìm hiểu về các nested class trong Java các bạn nhé!
Non-static nested class
Non-static nested class hay còn gọi là những Inner class. Chúng ta có thể declare những Inner class này bên trong một class khác như class Builder ở trên, bên trong một phương thức nào đó (Method-local Inner Class), ngoài ra chúng ta còn có những class không có tên gọi là Anonymous Inner Class.
Khác với việc khai báo một class, chúng ta không thể declare nó với private access modifier, đối với Inner class chúng ta có thể làm điều này. Như ví dụ trên, mình có thể declare class Builder là private như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.javaexample; public class Application { private class Builder { } } |
Mà khi đã declare một Inner class là private thì nó chỉ có thể được access bên trong class nó được khai báo thôi các bạn nhé!
Để khởi tạo một Inner class, các bạn cần khởi tạo đối tượng cho outer class trước. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.javaexample; public class Application { private class Builder { } public static void main(String[] args) { Application app = new Application(); Builder builder = app.new Builder(); } } |
Khi chúng ta khai báo một class bên trong một method nào đó, gọi là Method-local Inner Class, thì scope của class này chỉ thuộc về method đó mà thôi. Các bạn không thể khai báo class này với access modifier trong trường hợp này. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.javaexample; public class Application { public void print() { class Builder { } } } |
Và do đó, chúng ta chỉ có thể khởi tạo đối tượng của class này bên trong method:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class Application { public void print() { class Builder { } Builder builder = new Builder(); } } |
Các bạn có thể khai báo final class hoặc abstract class bên trong một method các bạn nhé:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.javaexample; public class Application { private void print() { abstract class Builder { } } } |
Hay:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.javaexample; public class Application { private void print() { final class Builder { } } } |
Anonymous Inner Class thường được khai báo khi chúng ta muốn override một phương thức nào đó của một class hoặc interface. Chúng ta sẽ khai báo Anonymous Inner Class và khởi tạo đối tượng cho class này cùng một thời điểm. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class Application { public void print() { Comparable<String> comparable = new Comparable<String>() { public int compareTo(String o) { return 0; } }; } } |
Các bạn cũng có thể declare Anonymous Inner Class bên ngoài method như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.javaexample; public class Application { Comparable<String> comparable = new Comparable<String>() { public int compareTo(String o) { return 0; } }; public void print() { } } |
Static Nested Class
Static nested class là những class được định nghĩa với từ khoá static. Nó là static member của outer class và do đó chúng ta không cần phải khởi tạo đối tượng của outer class và chính class này để access tới nó luôn. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava.javaexample; public class Application { static class Builder { private static void print() { } } public static void main(String[] args) { Application.Builder.print(); } } |
Static nested class sẽ không access được tới các field, methods non-static của outer class. Ví dụ như:
Chúng ta không thể declare Static nested class bên trong method các bạn nhé!