JavaRush /Blog Java /Random-VI /Toán tử instanceof trong Java

Toán tử instanceof trong Java

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ nói về toán tử instanceof, xem các ví dụ về cách sử dụng nó và đề cập đến một số điểm liên quan đến hoạt động của nó :) Ở các cấp độ đầu của JavaRush, bạn đã gặp toán tử này. Bạn có nhớ tại sao nó lại cần thiết không? Nếu không cũng không sao, chúng ta cùng nhau ghi nhớ nhé. Toán tử instanceof là cần thiết để kiểm tra xem đối tượng được tham chiếu bởi biến X có được tạo từ lớp Y nào đó hay không. Nghe có vẻ đơn giản. Tại sao chúng tôi quay lại chủ đề này? Trước hết, vì bây giờ bạn đã làm quen với cơ chế kế thừa trong Java và các nguyên tắc OOP khác. Chủ đề về instanceof sẽ rõ ràng hơn nhiều và chúng ta sẽ xem xét các trường hợp sử dụng nâng cao hơn. Đi! Toán tử Instanceof hoạt động như thế nào - 1Bạn có thể nhớ rằng toán tử instanceof trả về true nếu kết quả kiểm tra là đúng hoặc sai nếu kết quả là sai. Do đó, nó thường được tìm thấy trong nhiều loại điều kiện thử nghiệm khác nhau ( if…else). Hãy bắt đầu với những 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 xuất ra bảng điều khiển? Chà, điều đó rõ ràng ở đây :) Đối tượng х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 nó có thuộc về String không, chẳng hạn:
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 đã nhận được một lỗi. Và hãy chú ý: trình biên dịch đã phát hành nó ngay cả trước khi mã được thực thi! Anh ta ngay lập tức thấy rằng Số nguyên và Chuỗi không thể tự động chuyển đổi lẫn nhau và không có mối quan hệ kế thừa. Do đó, một đối tượng lớp Integer sẽ không được tạo từ Chuỗi. Điều này thuận tiện và giúp tránh các lỗi lạ đã xảy ra trong quá trình thực thi chương trình, 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ụ phức tạp hơn. Vì chúng ta đã đề cập đến tính kế thừa, hãy cùng làm việc với hệ thống lớp nhỏ này:
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 kiểm tra xem một đối tượng có thuộc một lớp trong tình huống bình thường hay không, nhưng điều gì sẽ xảy ra nếu chúng ta thêm mối quan hệ cha-con vào đây? Toán tử Instanceof hoạt động như thế nào - 2 Ví dụ: bạn nghĩ việc kiểm tra sau sẽ tạo ra điều 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);

   }
}
Đầu ra: true false Câu hỏi chính cần được trả lời là instanceof giải mã chính xác khái niệm “một đối tượng được tạo dựa trên một lớp” như thế nào? Kết quả là chúng tôi đã hiểu nó Сat instanceof Animal == true, nhưng người ta có thể tìm ra lỗi với công thức như vậy. Tại sao đối tượng này Catđược tạo dựa trên lớp Animal? Không phải nó chỉ được tạo dựa trên lớp riêng của nó sao? Câu trả lời khá đơn giản và có thể bạn đã đoán ra. Hãy nhớ thứ tự 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ề hàm tạo lớp . Đây là một ví dụ từ bài giảng đó:
public class Animal {

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

   public static int animalCount = 7700000;

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

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

class Cat extends Animal {

   String tail = "The initial value of tail in the Cat class";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
       System.out.println("The current value of the static variable catsCount = " + catsCount);
       System.out.println("Current value tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value 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ẽ trông 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 não trong lớp Động vật = Giá trị ban đầu của não trong lớp Động vật Giá trị hiện tại của trái tim trong lớp Động vật = Giá trị ban đầu của trái tim trong lớp Động vật Hàm tạo của lớp Động vật cơ sở đã hoàn thành công việc của mình! Giá trị hiện tại của brain = Brain Giá trị hiện tại của tim = Heart Hàm tạo của lớp Cat đã bắt đầu hoạt động (Hàm tạo Animal đã được thực thi) Giá trị hiện tại của biến tĩnh catsCount = 37 Giá trị hiện tại của tail = Giá trị ban đầu của tail trong Lớp mèo Giá trị hiện tại của tail = Tail Bây giờ bạn có nhớ không? :) Hàm tạo của lớp cơ sở, nếu có, luôn được gọi đầu tiên khi tạo bất kỳ đối tượng nào. Instanceof tuân theo nguyên tắc này khi nó cố gắng xác định xem một đối tượng có được Аtạo từ một lớp 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 MaineCoonkhông được gọi khi tạo Cat, điều này là hợp lý. Dù sao MaineCoonhắn cũng là hậu duệ Cat, không phải tổ tiên. Nhưng Catnó không phải là một khuôn mẫu cho. Được rồi, điều này có vẻ rõ rà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...việc này phức tạp hơn. Hãy thử lý luận. Chúng tôi có một biến loại Catvà chúng tôi đã gán một đối tượng loại cho nó MaineCoon. Nhân tiện, tại sao điều này lại có tác dụng? có khả năng làm cái này không? Có thể. Suy cho cùng, Maine Coon nào cũng là một con mèo. Nếu nó không hoàn toàn rõ ràng, hãy nhớ ví dụ với các phần mở rộng kiểu nguyên thủy:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Số 1024 ngắn : nó dễ dàng phù hợp với biến dài , vì số byte là đủ cho nó (bạn có nhớ ví dụ về những con búp bê lồng nhau không?) . Một đối tượng con luôn có thể được gán cho một biến tổ tiên. Bây giờ chỉ cần nhớ điều này và trong các bài giảng tiếp theo chúng ta sẽ phân tích sâu hơn về quá trình này. Vậy ví dụ của chúng ta sẽ tạo ra điều 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 lớp Cathay đối tượng lớp của chúng ta MaineCoon? Thực ra, câu trả lời cho câu hỏi này rất đơn giản. Bạn chỉ cần đọc lại định nghĩa về toán tử của chúng tôi: Toán tử instanceof là cần thiết để kiểm tra xem đối tượng được tham chiếu bởi biến có được Xtạo dựa trên một số lớp hay không Y. Toán tử instanceof kiểm tra nguồn gốc của một đối tượng chứ không phải một biến. Do đó, trong ví dụ, cả hai lần nó sẽ hiển thị true trong bảng điều khiển : chúng ta có một đối tượng thuộc loại MaineCoon. Đương nhiên, nó được tạo dựa trên lớp MaineCoon, nhưng cũng dựa trên lớp cha Cat!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION