Оновлення та посилання вниз є важливою частиною Java, яка дозволяє нам будувати складні програми, використовуючи простий синтаксис, і дає нам великі переваги, наприклад, поліморфізм або групування різних об'єктів. Java дозволяє об'єкту типу підкласу трактуватись як об'єкт будь-якого типу надкласу. Це називається оновленням. Оновлення відбувається автоматично, тоді як програму передачі каналів повинен робити вручну програміст , і я зроблю все можливе, щоб пояснити, чому так.
Оновлення та зрив НЕ схожі на передачу примітивів одне одному, і я вважаю, що це викликає багато плутанини, коли програміст починає вивчати кастинг об'єктів.
Поліморфізм: Усі методи у Java за замовчуванням є віртуальними. Це означає, що будь-який метод може бути відмінений при використанні у спадщину, якщо цей метод не оголошений як остаточний або статичний .
Нижче ви можете побачити приклад того, як getType();
працює залежно від типу об'єкта (собака, домашня тварина, поліцейська собака).
Припустимо, у вас є три собаки
Собака - це суперклас.
Pet Dog - Pet Dog розширює собаку.
Поліцейська собака - Поліцейська собака розширює собаку.
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
Поліморфізм: Усі методи у Java за замовчуванням є віртуальними. Це означає, що будь-який метод може бути скасований при використанні у спадщину, якщо цей метод не оголошений як остаточний або статичний. (Пояснення належить до концепції віртуальних таблиць)
Віртуальна таблиця / Таблиця відправки: Диспетчерська таблиця об'єкта буде містити адреси динамічно зв'язаних методів об'єкта. Виклики методів виконуються шляхом отримання адреси методу з таблиці відправки об'єкта. Таблиця відправлення однакова для всіх об'єктів, що належать до одного класу, і тому зазвичай поділяється між ними.
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
Друкує Normal Dog
obj2.getType();
Друкує Pet Dog
obj3.getType();
Друкує Police Dog
Програмування потрібно робити програмістом вручну
Коли ви намагаєтеся викликати secretID();
метод, на obj3
який є PoliceDog object
посилання, на Dog
який є суперкласом в ієрархії, він видає помилку, оскільки obj3
не має доступу до secretId()
методу. Для того, щоб викликати цей метод, вам потрібно перенести цей obj3 вручну на PoliceDog
( (PoliceDog)obj3).secretID();
який друкує ID
Аналогічним способом викликати dogName();
метод у PetDog
класі, на який потрібно obj2
перейти, PetDog
оскільки obj2 посилається на нього Dog
та не має доступу до dogName();
методу
( (PetDog)obj2).dogName();
Чому це так, що оновлення є автоматичним, але посилання вниз повинен бути ручним? Ну, бачите, оновлення ніколи не може провалитися. Але якщо у вас є група різних собак і хочуть їх всіх зворотне приведення до їх типу, то є шанс, що деякі з цих собак насправді різних типів , тобто, PetDog
, PoliceDog
і процес виходить з ладу, шляхом метання ClassCastException
.
Це є причиною, коли вам потрібно вручну підключити свої об'єкти, якщо ви віднесли свої об'єкти до типу суперкласу.
Примітка. Тут, посилаючись на те, що ви не змінюєте адресу пам'яті своїх ojects, коли ви спустили її, вона все одно залишається такою ж, ви просто групуєте їх у певний тип. Dog
Dog
- цеAnimal
. Більшість випадків оновлення не потрібні, якщо ви не хочете використовувати певний метод перевантаження.callme
існує в обохAnimal
іDog
.callme2
існує лише вDog
, на яке ти кидаєш,a
щобDog
він працював.