Nested class trong Java – Hướng Dẫn Java

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ư:

Nested class trong Java

Chúng ta không thể declare Static nested class bên trong method các bạn nhé!