CodeGym /Java блог /Случаен /Java екземпляр на Operator
John Squirrels
Ниво
San Francisco

Java екземпляр на Operator

Публикувано в групата
здрасти Днес ще говорим за оператора instanceof , ще разгледаме примери за това How се използва и ще се докоснем до някои аспекти на това How работи:) Вече сте срещали този оператор на ранните нива на CodeGym. Помните ли защо ни трябва? Ако не, не се притеснявайте. Нека си спомним заедно. Операторът instanceof е необходим, за да се провери дали даден обект, към който се отнася X променлива, е създаден въз основа на няHowъв Y клас. Това звучи просто. Защо се върнахме към тази тема? Първо, защото вече сте добре запознати с механизма за наследяване на Java и другите принципи на ООП. Операторът instanceof вече ще бъде много по-ясен и ще разгледаме по-напреднали примери за това How се използва. Да тръгваме!Как работи операторът instanceof - 1Вероятно си спомняте, че операторът instanceof връща true , ако проверката даде резултат true, or false , ако изразът е false. Съответно, обикновено се среща във всяHowви условни изрази ( if… else ). Нека започнем с няколко по-прости примера:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Какво мислите, че ще се показва на конзолата? Е, тук е очевидно.:) Обектът x е цяло число, така че резултатът ще бъде true . Конзолен изход: True Нека опитаме да проверим дали е String :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Получихме грешка. И обърнете внимание: компилаторът генерира грешката преди да изпълни codeа! Той веднага видя, че Integer и String не могат да бъдат автоматично преобразувани един в друг и не са свързани чрез наследяване. Следователно обект Integer не се създава въз основа на String . Това е удобно и помага да се избегнат странни грешки по време на изпълнение, така че компилаторът ни помогна тук :) Сега нека се опитаме да разгледаме примери, които са по-трудни. Тъй като споменахме наследяването, нека работим със следната малка система от класове:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Вече знаем How се държи instanceof , когато проверяваме дали даден обект е екземпляри на клас, но Howво се случва, ако разгледаме връзката родител-дете? Например, Howво мислите, че ще доведат тези изрази:

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);

   }
}
Резултат: True False Основният въпрос, на който трябва да се отговори, е How точно instanceof интерпретира „обект, създаден въз основа на клас“? ' cat instanceof Animal ' се оценява на true , но със сигурност можем да намерим грешка в тази формулировка. Защо обект Cat е създаден въз основа на класа Animal ? Не е ли създаден въз основа само на собствения си клас? Отговорът е достатъчно прост и може би вече сте се сетor за него. Запомнете реда, в който се извикват конструкторите и се инициализират променливите при създаване на обект. Вече разгледахме тази тема в статията за конструкторите на класове . Ето един пример от този урок:

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");
   }
}
И ако го стартирате в IDE, изходът на конзолата ще изглежда така: Изпълнява се конструктор на базов клас Animal. Инициализирани ли са вече променливите на класа Animal? Текуща стойност на статичната променлива animalCount = 7700000 Текуща стойност на мозъка в класа Animal = Първоначалната стойност на мозъка в класа Animal Текущата стойност на сърцето в класа Animal = Първоначалната стойност на сърцето в класа Animal Вече имате променливите на класа Cat инициализирано? Текуща стойност на статичната променлива catCount = 37 Конструкторът на базовия клас за животни е готов! Текуща стойност на мозъка = Мозък Текуща стойност heart = Heart Конструкторът на клас cat е стартиран (Конструкторът Animal вече е завършен) Текуща стойност на статичната променлива catCount = 37 Текуща стойност на опашката = Първоначална стойност на опашката в класа Cat Текуща стойност на опашката = Опашка Сега сещате ли се?:) Конструкторът на базовия клас, ако има базов клас, винаги се извиква първи при създаване на обект. Операторът instanceof се ръководи от този принцип, когато се опитва да определи дали A обект е създаден въз основа на B клас. Ако се извика конструкторът на базовия клас, тогава не може да има съмнение. С втората проверка всичко е по-просто:

System.out.println(cat instanceof MaineCoon);
Конструкторът MaineCoon не е извикан при създаването на обекта Cat , което има смисъл. В края на краищата мейнкуун е потомък на котката , а не прародител. И не е шаблон за Cat . Добре, мисля, че сме наясно с това. Но Howво ще стане, ако направим това?:

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);


   }
}
Хм... сега е по-трудно. Нека го обсъдим. Имаме променлива Cat , на която присвоихме обект MaineCoon . Между другото, защо това изобщо работи? Можем да направим това, нали? Да, можем. В края на краищата всеки мейнкуун е котка. Ако това не е съвсем ясно, спомнете си примера за разширяване на примитивни типове:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Числото 1024 е кратко : лесно се вписва в дълга променлива, тъй като има достатъчно byteове, за да го побере (спомняте ли си примера с куклите?). Обект-потомък винаги може да бъде присвоен на променлива на предшественик. Засега просто запомнете това и в следващите уроци ще анализираме How работи. И така, Howво извежда нашият пример?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Какво ще проверява instanceof ? нашата променлива Cat or нашия обект MaineCoon ? Отговорът е, че този въпрос всъщност е прост. Просто трябва да прочетете отново дефиницията на оператора: Операторът instanceof е необходим, за да проверите дали обект, към който се отнася X променлива, е създаден въз основа на няHowъв Y клас. Операторът instanceof тества произхода на обект, а не типа на променливата. Така в този пример нашата програма ще покаже true и в двата случая: имаме обект MaineCoon . Очевидно е създаден въз основа на класа MaineCoon , но е създаден въз основа на коткатародителски клас също!
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION