Toán tử instanceof trong Java là một toán tử được sử dụng để kiểm tra xem đối tượng này có phải là instance của một class hay interface nào đó hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đó là thể hiện của class mà các bạn đang check, ngược lại thì false.
Ví dụ, mình có một class Application như sau:
1
2
3
4
5
6
7
8
9
10
package
com
.
huongdanjava
.
java
;
public
class
Application
{
public
static
void
main
(
String
[
]
args
)
{
Application
application
=
new
Application
(
)
;
System
.
out
.
println
(
application
instanceof
Application
)
;
}
}
Trong hàm main() của class này, mình initialize một đối tượng của class Application và sử dụng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? Các bạn sẽ thấy kết quả sẽ như sau:
Nếu các bạn viết code như sau:
1
2
3
4
5
6
7
8
9
10
package
com
.
huongdanjava
.
java
;
public
class
Application
{
public
static
void
main
(
String
[
]
args
)
{
Application
application
=
new
Application
(
)
;
System
.
out
.
println
(
application
instanceof
String
)
;
}
}
thì IDE sẽ báo lỗi ngay:
Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho các bạn biết ngay.
Nhưng nếu bạn có một interface với hai implementation như sau:
1
2
3
4
5
package
com
.
huongdanjava
.
java
;
public
interface
Shape
{
}
1
2
3
4
5
package
com
.
huongdanjava
.
java
;
public
class
Triangle
implements
Shape
{
}
1
2
3
4
5
package
com
.
huongdanjava
.
java
;
public
class
Rectangle
implements
Shape
{
}
thì lúc này nếu các bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,
1
2
3
4
5
6
7
8
9
10
11
package
com
.
huongdanjava
.
java
;
public
class
Application
{
public
static
void
main
(
String
[
]
args
)
{
Shape
shape
=
new
Triangle
(
)
;
System
.
out
.
println
(
shape
instanceof
Rectangle
)
;
}
}
IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy các bạn sẽ thấy kết quả như sau:
Chúng ta sẽ thường sử dụng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của một phương thức có phải là instance của một class nào đó hay không? Ví dụ như:
1
2
3
4
5
6
7
private
void
check
(
Shape
shape
)
{
if
(
shape
instanceof
Triangle
)
{
Triangle
triangle
=
(
Triangle
)
shape
;
System
.
out
.
println
(
“This is triangle: “
+
triangle
.
toString
(
)
)
;
}
}
Trong phương thức trên, tham số interface Shape có nhiều implementation khác nhau, trong phần body của phương thức, chúng ta sẽ check xem là instance được truyền vào phương thức này có phải là Triangle hay không? Nếu đúng thì xử lý code tiếp.
Kết quả:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
com
.
huongdanjava
.
java
;
public
class
Application
{
private
void
check
(
Shape
shape
)
{
if
(
shape
instanceof
Triangle
)
{
Triangle
triangle
=
(
Triangle
)
shape
;
System
.
out
.
println
(
“This is triangle: “
+
triangle
.
toString
(
)
)
;
}
}
public
static
void
main
(
String
[
]
args
)
{
Application
application
=
new
Application
(
)
;
application
.
check
(
new
Triangle
(
)
)
;
}
}
Từ Java 14, các bạn có thể viết lại phương thức check() sử dụng pattern matching instanceof, đơn giản như sau:
1
2
3
4
5
private
void
check
(
Shape
shape
)
{
if
(
shape
instanceof
Triangle
triangle
)
{
System
.
out
.
println
(
“This is triangle: “
+
triangle
.
toString
(
)
)
;
}
}
Với cách viết mới, chúng ta không cần viết thêm một dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.
Kết quả vẫn như vậy: