Toán tử instanceof trong Java được sử dụng để kiểm tra xem đối tượng có phải là một thể hiện của loại được chỉ định (class hoặc subclass hoặc interface) hay không.
instanceof trong Java còn được gọi là toán tử so sánh kiểu (comparison operater) vì nó so sánh thể hiện với kiểu.
- instanceof trả về true hoặc false.
- Nếu chúng ta áp dụng toán tử instanceof với bất kỳ biến nào có giá trị null, nó sẽ trả về false.
Ví dụ đơn giản sử dụng instanceof trong Java
Chúng ta hãy xem ví dụ đơn giản về toán tử instanceof để kiểm tra xem đối tượng có phải là thể hiện của một class được chỉ định hay không.
class ViDuInstanceof{
public static void main(String args[]){
ViDuInstanceof a = new ViDuInstanceof();
System.out.println(a instanceof ViDuInstanceof);
}
}
Khi chạy chương trình, kết quả nhận được là:
true
Điều này chứng tỏ là: a là một thể hiện của class ViDuInstanceof
Ngoài ra, một đối tượng của subclass cũng là một kiểu của super class.
Ví dụ: nếu class Cho là mở rộng của DongVat thì đối tượng được tạo ra từ class Cho có thể được gọi bằng class Cho hoặc DongVat.
// Tạo class DongVat
class DongVat{}
// Tạo class Cho kế thừa class DongVat
class Cho extends DongVat{
public static void main(String args[]){
Cho cauVang = new Cho();
System.out.println(cauVang instanceof DongVat);
}
}
Khi chạy chương trình, kết quả nhận được là:
true
>. Đọc thêm: Class trong Java
Sử dụng instanceof với một biến có giá trị null trong Java
Nếu chúng ta áp dụng toán tử instanceof với một biến có giá trị null, nó sẽ trả về false.
Chúng ta hãy xem ví dụ được bên dưới đây:
class Cho{
public static void main(String args[]){
Cho cauVang = null;
System.out.println(cauVang instanceof Cho);
}
}
Khi chạy chương trình, kết quả nhận được là:
false
Thực hiện Downcasting với toán tử instanceof trong Java
Khi kiểu của class con (subclass) đề cập đến đối tượng của lớp cha (super class), nó được gọi là downcasting.
Nếu chúng ta thực hiện nó trực tiếp, trình biên dịch sẽ báo lỗi biên dịch.
Cho cauVang = new DongVat(); // Lỗi biên dịch
Nếu bạn thực hiện nó bằng cách typecasting, ClassCastException sẽ bị ném khi chạy tại thời điểm run-time.
// Biên dịch thành công
// ClassCastException được ném ra lại thời điểm runtime
Cho cauVang = (Cho)new DongVat();
Nhưng nếu chúng ta sử dụng toán tử instanceof, việc thực hiện downcasting là có thể.
Ví dụ downcasting với toán tử instanceof trong Java
Hãy xem ví dụ sau để thấy các thực hiện downcasting với toán tử instanceof.
class DongVat { }
class Cho extends DongVat {
static void method(DongVat cauVang) {
if(cauVang instanceof Cho){
// Downcasting
Cho c = (Cho)cauVang;
System.out.println("Thực hiện downcasting thành công!");
}
}
public static void main (String [] args) {
DongVat cauVang = new Cho();
Cho.method(cauVang);
}
}
Kết quả khi cạy chương trình:
Thực hiện downcasting thành công!
Ví dụ downcasting không có toán tử instanceof trong Java
Downcasting cũng có thể được thực hiện mà không cần sử dụng toán tử instanceof như ví dụ sau:
class DongVat { }
class Cho extends DongVat {
static void method(DongVat cauVang) {
// Thực hiện downcasting không có instanceof
Cho c = (Cho)cauVang;
System.out.println("Thực hiện downcasting thành công!");
}
public static void main (String [] args) {
DongVat cauVang = new Cho();
Cho.method(cauVang);
}
}
Kết quả khi cạy chương trình:
Thực hiện downcasting thành công!
Chúng ta hãy xem xét kỹ hơn về thực hiện downcasting mà không có instanof
- Đối tượng thực tế được gọi là cauVang là một đối tượng của lớp Cho.
- Vì vậy, nếu chúng ta downcast nó, OK
Nhưng điều gì sẽ xảy ra nếu chúng ta viết như thế này?
DongVat cauVang = new DongVat();
Cho.method(cauVang);
ClassCastException sẽ bị ném ra tại thời điểm runtime. Nhưng nếu sử dụng instanceof thì không vấn đề gì.
Ví dụ sử dụng toán tử instanceof trong thực tế lập trình Java
Hãy xem việc sử dụng toán tử instanceof trong thực tế bằng ví dụ bên dưới đây:
interface InPhuongThuc{}
class A implements InPhuongThuc{
public void phuongThucA(){
System.out.println("Phương thức A");}
}
class B implements InPhuongThuc{
public void phuongThucB(){
System.out.println("Phương thức B");}
}
class GoiPhuongThuc{
void goiPhuongThuc(InPhuongThuc inPhuongThuc){ // upcasting
if(inPhuongThuc instanceof A){
A a = (A)inPhuongThuc; // Downcasting
a.phuongThucA();
}
if(inPhuongThuc instanceof B){
B b = (B)inPhuongThuc; // Downcasting
b.phuongThucB();
}
}
} // Kết thúc class GoiPhuongThuc
class Main{
public static void main(String args[]){
InPhuongThuc inPhuongThuc = new B();
GoiPhuongThuc goi = new GoiPhuongThuc();
goi.goiPhuongThuc(inPhuongThuc);
}
}
Khi chạy chương trình, kết quả nhận được là:
Phương thức B
Như bạn thấy, để gọi được đúng phương thức, chúng ta phải có đúng đối tượng.
Do đó, khi thực hiện goi.goiPhuongThuc(ip). Chúng ta phải kiểm tra xem ip là kiểu của class nào.
Thực hiện upcasting để sử dụng làm tham chiếu kiểm tra.
Nếu kiểm tra thấy đúng là thể hiện của class nào thì thực hiện downcasting để gọi được phương thức tương ứng với class đó.
Bạn đã hiểu về instanceof trong Java chưa?
Trên đây là một vài ví dụ đơn giản để bạn hiểu hơn về toán tử instanceof trong Java. Cũng như cách sử dụng instanceof trong thực tế như thế nào.
Chúc bạn Tự học Java tốt.