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é!
Tóm Tắt
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
(
)
{
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
(
)
{
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
(
)
{
abstract
class
Builder
{
}
}
}
Hay:
1
2
3
4
5
6
7
8
9
10
package
com
.
huongdanjava
.
javaexample
;
public
class
Application
{
private
void
(
)
{
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
(
)
{
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
(
)
{
}
}
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
(
)
{
}
}
public
static
void
main
(
String
[
]
args
)
{
Application
.
Builder
.
(
)
;
}
}
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é!