CodeGym /Blog Java /Ngẫu nhiên /Java instanceof Toán tử

Java instanceof Toán tử

Xuất bản trong nhóm
CHÀO! Hôm nay chúng ta sẽ nói về toán tử instanceof , xem xét các ví dụ về cách nó được sử dụng và đề cập đến một số khía cạnh về cách thức hoạt động của nó :) Bạn đã gặp toán tử này ở các cấp độ đầu của CodeGym. Bạn có nhớ tại sao chúng ta cần nó không? Nếu không, không phải lo lắng. Hãy cùng nhau ghi nhớ. Toán tử instanceof là cần thiết để kiểm tra xem một đối tượng được tham chiếu bởi một biến X có được tạo dựa trên một số lớp Y hay không. Điều đó nghe có vẻ đơn giản. Tại sao chúng ta quay trở lại chủ đề này? Trước hết, vì bây giờ bạn đã quen thuộc với cơ chế kế thừa của Java và các nguyên tắc khác của OOP. Toán tử instanceof bây giờ sẽ rõ ràng hơn nhiều và chúng ta sẽ xem xét các ví dụ nâng cao hơn về cách nó được sử dụng. Đi nào!Cách hoạt động của toán tử instanceof - 1Bạn có thể nhớ rằng toán tử instanceof trả về true nếu kiểm tra đánh giá là true hoặc false nếu biểu thức sai. Theo đó, nó thường xuất hiện trong tất cả các loại biểu thức điều kiện ( if…else ). Hãy bắt đầu với một số ví dụ đơn giản hơn:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Bạn nghĩ gì sẽ được hiển thị trên bảng điều khiển? Chà, ở đây rõ ràng rồi. :) Đối tượng x là một Số nguyên, vì vậy kết quả sẽ là true . Đầu ra của bảng điều khiển: True Hãy thử kiểm tra xem đó có phải là String hay không :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Chúng tôi gặp lỗi. Và hãy chú ý: trình biên dịch đã tạo ra lỗi trước khi chạy mã! Nó thấy ngay rằng IntegerString không thể tự động chuyển đổi cho nhau và không liên quan thông qua kế thừa. Do đó, một đối tượng Số nguyên không được tạo dựa trên Chuỗi . Điều này thuận tiện và giúp tránh các lỗi thời gian chạy lạ, vì vậy trình biên dịch đã giúp chúng tôi ở đây :) Bây giờ chúng ta hãy thử xem xét các ví dụ khó hơn. Vì chúng tôi đã đề cập đến tính kế thừa, hãy làm việc với hệ thống các lớp nhỏ sau:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Chúng ta đã biết instanceof hoạt động như thế nào khi chúng ta kiểm tra xem một đối tượng có phải là một thể hiện của một lớp hay không, nhưng điều gì sẽ xảy ra nếu chúng ta xem xét mối quan hệ cha-con? Ví dụ: bạn nghĩ những biểu thức này sẽ mang lại kết quả gì:

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Kết quả: Đúng Sai Câu hỏi chính cần được trả lời chính xác là cách instanceof diễn giải 'đối tượng được tạo dựa trên một lớp'? ' cat instanceof Animal ' đánh giá là đúng , nhưng chắc chắn chúng ta có thể tìm thấy lỗi với từ ngữ đó. Tại sao đối tượng Cat được tạo dựa trên lớp Animal ? Không phải nó được tạo ra chỉ dựa trên lớp của chính nó sao? Câu trả lời khá đơn giản và bạn có thể đã nghĩ đến nó. Hãy nhớ thứ tự mà các hàm tạo được gọi và các biến được khởi tạo khi tạo một đối tượng. Chúng tôi đã đề cập đến chủ đề này trong bài viết về các hàm tạo của lớp . Đây là một ví dụ từ bài học đó:

public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The Cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Và nếu bạn chạy nó trong IDE, đầu ra của giao diện điều khiển sẽ như thế này: Hàm tạo của lớp cơ sở Animal đang chạy Các biến của lớp Animal đã được khởi tạo chưa? Giá trị hiện tại của biến tĩnh animalCount = 7700000 Giá trị hiện tại của brain trong lớp Animal = Giá trị ban đầu của brain trong lớp Animal Giá trị hiện tại của heart trong lớp Animal = Giá trị ban đầu của heart trong lớp Animal Đã có các biến của lớp Cat rồi đã được khởi tạo? Giá trị hiện tại của biến tĩnh catCount = 37 Trình tạo lớp cơ sở động vật đã hoàn tất! Giá trị hiện tại của brain = Brain Giá trị hiện tại heart = Heart Hàm tạo của lớp mèo đã bắt đầu (Trạng thái Animal đã hoàn thành) Giá trị hiện tại của biến tĩnh catCount = 37 Giá trị hiện tại của đuôi = Giá trị ban đầu của đuôi trong lớp Cat Giá trị hiện tại của đuôi = Đuôi Bây giờ bạn đã nhớ chưa?:) Hàm tạo của lớp cơ sở, nếu có lớp cơ sở, luôn được gọi đầu tiên khi tạo đối tượng. Toán tử instanceof được hướng dẫn bởi nguyên tắc này khi cố gắng xác định xem một đối tượng A có được tạo dựa trên lớp B hay không . Nếu hàm tạo của lớp cơ sở được gọi, thì không còn nghi ngờ gì nữa. Với lần kiểm tra thứ hai, mọi thứ đơn giản hơn:

System.out.println(cat instanceof MaineCoon);
Hàm tạo MaineCoon không được gọi khi đối tượng Cat được tạo, điều này hợp lý. Xét cho cùng, MaineCoon là hậu duệ của Cat , không phải tổ tiên. Và nó không phải là khuôn mẫu cho Cat . Được rồi, tôi nghĩ chúng ta rõ ràng về điều đó. Nhưng điều gì sẽ xảy ra nếu chúng ta làm điều này?:

public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Hmm... bây giờ điều đó khó hơn. Hãy nói về nó. Chúng ta có một biến Cat mà chúng ta đã gán một đối tượng MaineCoon . Nhân tiện, tại sao điều đó thậm chí còn hoạt động? Chúng ta có thể làm điều đó, phải không? Vâng, chúng tôi có thể. Rốt cuộc, mọi MaineCoon đều là một con mèo. Nếu điều đó không hoàn toàn rõ ràng, hãy nhớ ví dụ về mở rộng các kiểu nguyên thủy:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Số 1024 là một số ngắn : nó dễ dàng phù hợp với một biến dài , vì có đủ byte để chứa nó (bạn có nhớ ví dụ với những con búp bê không?). Một đối tượng con cháu luôn có thể được gán cho một biến tổ tiên. Hiện tại, bạn chỉ cần ghi nhớ điều này và trong các bài học tiếp theo, chúng ta sẽ phân tích cách thức hoạt động của nó. Vậy ví dụ của chúng ta xuất ra cái gì?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
instanceof sẽ kiểm tra cái gì? biến Cat hay đối tượng MaineCoon của chúng ta ? Câu trả lời là câu hỏi này thực sự đơn giản. Bạn chỉ cần đọc lại định nghĩa của toán tử: Cần có toán tử instanceof để kiểm tra xem một đối tượng được tham chiếu bởi một biến X có được tạo dựa trên một lớp Y nào đó hay không . Toán tử instanceof kiểm tra nguồn gốc của một đối tượng, không phải loại biến . Vì vậy, trong ví dụ này, chương trình của chúng ta sẽ hiển thị đúng trong cả hai trường hợp: chúng ta có một đối tượng MaineCoon . Rõ ràng, nó được tạo dựa trên lớp MaineCoon , nhưng nó được tạo dựa trên lớp Catlớp cha cũng vậy!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION