Chuyển đến nội dung chính

Java: Toán Tử instanceof

Toán tử instanceof trong java

Toán tử instanceof trong java được sử dụng để kiểm tra một đối tượng có phải là thể hiển của một kiểu dữ liệu cụ thể không (lớp, lớp con, interface).
instanceof trong java được gọi là toán tử so sánh kiểu vì nó so sánh thể hiện với kiểu dữ liệu. Nó trả về giá trị boolean là true hoặc false. Nếu bạn dùng toán tử instanceof với bất kỳ biến nào mà có giá trị null, giá trị trả về sẽ là false.

Ví dụ về toán tử instanceof trong java

public class Simple1 {
    public static void main(String args[]) {
        Simple1 s = new Simple1();
        System.out.println(s instanceof Simple1);// true
    }
}
Output:
true
Một đối tượng có kiểu của lớp con thì cũng có kiểu của lớp cha. Ví dụ, nếu Dog kế thừa Animal thì đối tượng của Dog có thể tham chiếu đến cả hai lớp Dog và Animal.

Ví dụ khác về toán tử instanceof trong java

class Animal {}
 
public class Dog extends Animal {// Dog inherits Animal
 
    public static void main(String args[]) {
        Dog dog = new Dog();
        System.out.println(dog instanceof Animal);// true
    }
}
Output:
true
instanceof trong java với biến có giá trị null
Nếu bạn sử dụng toán tử instanceof với biến có kiểu bất kỳ có giá trị null thì giá trị trả về luôn là null. Ví dụ.
public class Dog2 {
    public static void main(String args[]) {
        Dog2 d = null;
        System.out.println(d instanceof Dog2);// false
    }
}
Output:
false

Downcasting với toán tử instanceof trong java

Khi kiểu của lớp con tham chiếu tới đối tượng của lớp cha được gọi là downcasting. Nếu bạn thực hiện tham chiếu trực tiếp thì trình biên dịch sẽ báo lỗi biên dịch. Nếu bạn thực hiện bằng việc ép kiểu thì lỗi ngoại lệ ClassCastException được ném ra lúc runtime. Nhưng nếu bạn sử dụng toán tử instanceof thì downcasting được.
Tham chiếu trực tiếp:
Dog d=new Animal();//Compilation error 
Sử dụng ép kiểu dữ liệu:
Dog d=(Dog)new Animal();
// Compile ok, nhưng lỗi ngoại lệ ClassCastException lúc runtime

Ví dụ downcasting với instanceof

class Animal {}
 
public class Dog3 extends Animal {
    static void method(Animal a) {
        if (a instanceof Dog3) {
            Dog3 d = (Dog3) a;// downcasting
            System.out.println("downcasting is ok");
        }
    }
 
    public static void main(String[] args) {
        Animal a = new Dog3();
        Dog3.method(a);
    }
}
Output:
downcasting is ok

Ví dụ downcasting không sử dụng instanceof

class Animal {}
 
public class Dog4 extends Animal {
    static void method(Animal a) {
        Dog4 d = (Dog4) a;// downcasting
        System.out.println("downcasting is ok");
    }
 
    public static void main(String[] args) {
        Animal a = new Dog4();
        Dog4.method(a);
    }
}
Output:
downcasting is ok
Hãy đi sâu vào vấn đề gần hơn chút, thực tế đối tượng được tham chiếu bởi biến a là một đối tượng của lớp Dog4. Vì vậy chúng ta thực hiện downcasting nó thì ok. Nhưng nếu code như sau thì chuyện gì sẽ xảy ra?
Animal a=new Animal(); 
Dog.method(a); 
// lỗi ngoại lệ ClassCastException

Ví dụ sử dụng toán tử instanceof để xác định kiểu phần tử của mảng

public class Test6 {
    public static void main(String[] args) {
        Object[] objArray = new Object[4];
        objArray[0] = "hello";
        objArray[1] = 1000L;
        objArray[2] = 20;
        objArray[3] = 'c';
 
        for (int i = 0; i < objArray.length; i++) {
            if (objArray[i] instanceof Integer) {
                System.out.println("kieu integer: " + objArray[i]);
            else if (objArray[i] instanceof Long) {
                System.out.println("kieu long: " + objArray[i]);
            else if (objArray[i] instanceof Character) {
                System.out.println("kieu char: " + objArray[i]);
            else {
                System.out.println("kieu khac: " + objArray[i]);
            }
        }
    }
}
Output:
kieu khac: hello
kieu long: 1000
kieu integer: 20
kieu char: c

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...