JavaRush /Blog Java /Random-VI /cơ bản về instanceof và kế thừa

cơ bản về instanceof và kế thừa

Xuất bản trong nhóm
Xin chào! Trong các bài giảng trước, chúng ta đã nhiều lần gặp khái niệm kế thừa. Hôm nay chúng ta cũng sẽ đề cập đến chủ đề này, nhưng cũng không quá sâu sắc. Sẽ có bài giảng chi tiết về vấn đề này sau, nhưng hôm nay chúng ta sẽ chỉ xem xét các ví dụ thực tế và làm quen với một toán tử thú vị trong Java.

Kế thừa Java

Vậy chính xác thì thừa kế là gì? Khái niệm cơ bản về instanceof và kế thừa - 1Kế thừa là một cơ chế trong lập trình, bao gồm cả Java, cho phép bạn mô tả một lớp mới dựa trên lớp hiện có. Lớp con sau đó có quyền truy cập vào các trường và phương thức của lớp cha. Tại sao điều này có thể cần thiết? Ví dụ, hãy tưởng tượng rằng bạn cần tạo một số loại ô tô trong chương trình: Xe tải, Đua xe, Sedan, Xe bán tải, v.v. Ngay cả khi không bắt đầu viết mã, bạn vẫn biết chắc chắn rằng các lớp này có nhiều điểm chung: tất cả các ô tô đều có tên mẫu, năm sản xuất, kích thước động cơ, tốc độ tối đa, v.v. (chưa kể đến việc chúng đều có bánh xe và các bộ phận khác). Trong tình huống như vậy, bạn có thể:
  • Tạo các trường này trong mỗi lớp và thêm chúng vào các lớp ô tô mới khi chúng được tạo
  • Di chuyển các trường chung cho tất cả các máy vào lớp cha Carvà tất cả các lớp của các loại máy cụ thể sẽ kế thừa từ Carviệc sử dụng từ mở rộng .
Tất nhiên, lựa chọn thứ hai thuận tiện hơn nhiều:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Ở mức tối thiểu, chúng ta đã tránh được sự trùng lặp mã không cần thiết và đây là điều chúng ta nên luôn cố gắng đạt được khi viết chương trình. Ngoài ra, chúng tôi có cấu trúc lớp đơn giản và dễ hiểu: các trường chung cho tất cả các máy được đặt trong một lớp. Ví dụ: nếu xe tải có một số trường cụ thể mà các ô tô khác không có, chúng có thể được khai báo trong lớp Truck. Điều tương tự cũng xảy ra với các phương pháp. Tất cả các ô tô đều có một số hành vi chung có thể được mô tả: khởi động ô tô, ga/phanh, v.v. Các phương thức chung này có thể được đặt trong một lớp chung Carvà hành vi cụ thể của từng loại cụ thể có thể được mô tả trong các lớp con.
public class Car {

   public void gas() {
       //...gas
   }

   public void brake() {
       //...brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Chúng tôi đã chuyển các phương thức chung của tất cả ô tô vào lớp Car. Nhưng ở hạng kế nhiệm F1Car, mô tả xe đua Công thức 1 - điểm dừng (dừng để bảo dưỡng xe khẩn cấp), chỉ được thực hiện trong cuộc đua và được phân biệt bằng hành vi cụ thể.

Toán tử instanceof của Java

Để kiểm tra xem một đối tượng có được tạo dựa trên một lớp hay không, có một toán tử đặc biệt trong Java - instanceof. Nó trả về giá trị truenếu kiểm tra là đúng hoặc falsenếu kết quả là sai. Hãy xem nó hoạt động như thế nào bằng cách sử dụng các lớp ô tô của chúng tôi làm ví dụ:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Đầu ra: true Kiểm tra bằng cách sử dụng toán tử instanceofđược trả về true, vì chúng ta có một đối tượng của lớp Truckvà tất cả xe tải đều là ô tô. Lớp này Trucklà hậu duệ của lớp Car, do đó, tất cả các xe tải đều được tạo ra dựa trên một cha mẹ chung - ô tô. Hãy chú ý đến toán tử instanceof: nó được viết không có dấu chấm, vì nó là toán tử, không phải phương thức (“đối tượng instanceof Class”). Hãy thử cách khác:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Đầu ra: false Lớp Carvà theo đó, đối tượng của nó không xuất phát từ lớp Truck. Tất cả xe tải đều là ô tô, nhưng không phải tất cả ô tô đều là xe tải. Các đối tượng Carkhông được tạo dựa trên lớp Truck. Một ví dụ nữa:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Đầu ra: Đúng Logic ở đây cũng đơn giản: tất cả các lớp trong Java, bao gồm cả những lớp mà bạn đã tạo, đều đến từ một lớp Object(mặc dù bạn không viết đối tượng mở rộng trong chúng - cơ chế này tiềm ẩn trong chúng). Tại sao điều này có thể hữu ích và trong hoàn cảnh nào? Việc sử dụng phổ biến nhất của toán tử instanceoflà ghi đè phương thức equals(). Ví dụ: đây là cách phương thức này được triển khai equalstrong lớp String:
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
Trước khi so sánh chuỗi với đối tượng được truyền, phương thức này sẽ kiểm tra: đối tượng được truyền có thực sự là một chuỗi không? Và chỉ sau đó anh ta mới bắt đầu so sánh tính chất của hai đồ vật. Nếu không có bước kiểm tra này, bạn có thể chuyển bất kỳ đối tượng nào có trường giá trịđộ dài vào phương thức và so sánh nó với một chuỗi, tất nhiên, điều này sẽ sai.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION