CodeGym /Java блог /Случаен /Instanceof и наследяване в Java
John Squirrels
Ниво
San Francisco

Instanceof и наследяване в Java

Публикувано в групата
здрасти В предишните уроци вече се запознахме накратко с концепцията за наследяване. Днес отново ще засегнем тази тема, но отново не твърде дълбоко. Все още ще имаме по-подробен урок за това в бъдеще. Днес просто ще хвърлим бърз поглед на няколко практически примера и ще се запознаем с един интересен оператор в Java.

Наследство

И така, Howво е наследство? instanceof и наследяване 101 - 1 Наследяването е механизъм за програмиране (включително в Java), който ви позволява да декларирате нов клас въз основа на съществуващ. След това производният клас получава достъп до полетата и методите на родителския клас. Защо ще имаме нужда от това? Е, представете си, че трябва да създадете няколко класа автомобor в програма: камион, състезателна кола, седан, пикап и т.н. Дори преди да напишете Howъвто и да е code, знаете със сигурност, че всички тези класове имат много общо: всички автомобor имат модел име, година на производство, обем на двигателя, максимална скорост и т.н. (да не говорим за факта, че всички имат общи колела и други части). В тази ситуация можете:
  • Създайте тези полета във всеки клас (добавете ги към всеки нов клас автомобил, докато го създавате)
  • Пренесете общите за всички автомобor полета в Carродителски клас и след това използвайте ключовата дума extends , за да извлечете всички класове за конкретни типове автомобor от Carкласа.
Естествено, вторият вариант е много по-удобен:

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);
   }
}
Като минимум избягваме ненужното дублиране на code (и винаги трябва да се стремим към това, когато пишем програми). Освен това имаме проста и разбираема класова структура, с всички полета, общи за всички автомобor, консолидирани в един клас. Ако камионите имат специални полета, които другите автомобor нямат, те могат да бъдат декларирани в Truckкласа. Същото важи и за методите. Всички автомобor имат определено общо поведение, което може да бъде описано с методи, например стартиране на колата, ускоряване/спиране и т.н. Тези общи методи могат да бъдат консолидирани в родителския клас Carи всеки конкретен тип кола може да дефинира своите уникални действия в своите производни класове .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Добавихме към Carкласа методите, общи за всички автомобor. Но погледнете F1Carкласа, който представлява състезателните автомобor от "Формула 1". Спирания в бокса (спирки за спешна поддръжка на автомобил) се правят само в състезания, така че добавихме тази специфична функционалност към съответния производен клас. instanceof и наследяване 101 - 2

инстанция на оператор

В Java има специален оператор, instanceof , за проверка дали даден обект е създаден въз основа на определен клас. Връща true or false в зависимост от резултата от проверката. Нека да видим How работи, като използваме класовете в нашия пример за кола:

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Изход: true Операторът instanceofвръща true , тъй като имаме Truckобект и всички камиони са автомобor. Класът Truckсе извлича от Carкласа. Всички камиони са създадени въз основа на общия родител, Carкласа. Погледнете внимателно How instanceofсе използва операторът. Пишете го без точка, тъй като това е оператор, а не метод ("обект инстанция на клас"). Нека опитаме по друг начин:

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Изход: невярно Класът Car(и автомобилните обекти) не произлизат от Truckкласа. Всички камиони са коли, но не всички коли са камиони. Carобектите не са базирани на Truckкласа. Още един пример:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Изход: Вярно Тук логиката също е проста: всички класове в Java, включително класовете, които създавате, произлизат от класа Object(въпреки че не пишете „разширява обекта“ — това вече се подразбира). Как и кога би било полезно това? Операторът instanceofсе използва най-често при замяна на equals()метода. Например, ето How equalsметодът е имплементиран в 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;
}
Преди да сравни a Stringс предавания обект, методът тества дали обектът е дори низ? Едва след това започва да сравнява свойствата на двата обекта. Ако този тест не съществуваше, всеки обект с полета за стойност и дължина можеше да бъде предаден на метода и сравнен със String, което би било грешно, разбира се.
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION