Типове приведення об'єктів | Частина-9 | Основи Java: ООП (Object Oriented Programming) | автор: Сахіл Хамірані
- Ми можемо використовувати посилання на батьківський клас для зберігання об'єкта дочірнього класу.
Приклад:
Object o = new String(“Sahil”);
- Ми можемо використовувати посилання на інтерфейс для зберігання об'єкта реалізованого класу.
Приклад:
Runnable r = new Thread();
Синтаксис типового приведення об'єктів | автор: Сахіл Хамірані
Мантра 1 (Перевірка на етапі компіляції 1):
- Типи ‘d’ і ‘C’ повинні бути пов’язані між собою або як батько і син, або як однаковий тип. В іншому випадку виникне помилка на етапі компіляції.
Помилка на етапі компіляції:
Несумісні типи | автор: Сахіл Хамірані
Приклад 1: ✅
Object o = new String("Sahil");
StringBuffer sb = (StringBuffer)o;
Приклад 2: ❌
String s = new String("Sahil");
StringBuffer sb = (StringBuffer)s; // Помилка на етапі компіляції: Несумісні типи
// знайдений: java.lang.String
// потрібно: java.lang.StringBuffer
Мантра 2 (Перевірка на етапі компіляції 2):
- ‘C’ повинен бути або таким самим типом, або похідним типом від ‘A’. В іншому випадку виникне помилка на етапі компіляції.
Помилка на етапі компіляції:
Несумісні типи | автор: Сахіл Хамірані
Приклад 1: ✅
Object o = new String("Sahil");
StringBuffer sb = (StringBuffer)o;
Приклад 2: ❌
Object o = new String("Sahil");
StringBuffer sb = (String)o; // Помилка на етапі компіляції: Несумісні типи
// знайдений: java.lang.String
// потрібно: java.lang.StringBuffer
Мантра 3 (Перевірка на етапі виконання):
- Тип об'єкта ‘d’ на етапі виконання повинен бути або таким самим, або похідним від ‘C’. В іншому випадку виникне виняток під час виконання.
Виняток під час виконання: ClassCastException
Приклад 1: ❌
Object o = new String("Sahil");
StringBuffer sb = (StringBuffer)o; // Виняток під час виконання: ClassCastException: java.lang.String не може бути приведений до java.lang.StringBuffer
Приклад 2: ✅
Object o = new String("Sahil");
Object o1 = (String)o;
Тепер я надаю приклади, щоб ви вирішили їх самостійно і залишили коментарі без перегляду наданих відповідей.
Типове приведення об'єктів | автор: Сахіл Хамірані
Base2 b = new Derv4();
Приклади:
Object o = (Base2)b;
Object o = (Base1)b;
Object o = (Der3)b;
Base2 b1 = (Base1)b;
Base1 b1 = (Der4)b;
Base1 b1 = (Der1)b;
Відповіді:
- ✅
- ❌ // Помилка на етапі компіляції: Несумісні типи
- ❌ // Виняток під час виконання: ClassCastException
- ❌ // Помилка на етапі компіляції: Несумісні типи
- ❌ // Помилка на етапі компіляції: Несумісні типи
- ❌ // Помилка на етапі компіляції: Несумісні типи
- Строго кажучи, через приведення типів ми не створюємо новий об'єкт.
- Для існуючого об'єкта ми надаємо посилання іншого типу, тобто виконуємо приведення типів, але не кастинг об'єкта.
Приклад 1:
Типове приведення об'єктів | Приклад 1 | автор: Сахіл Хамірані
Приклад 2:
Типове приведення об'єктів | Приклад 2 | автор: Сахіл Хамірані
Примітка щодо типового приведення об'єктів | автор: Сахіл Хамірані
Приклад 1: Розглянемо наступний код, які з цих методів є дійсними:
P — — — -> m1()
|
|
|
C — — — -> m2()
C c = new C();
c.m1();
c.m2();
((P)c).m1();
((P)c).m2();
Залиште коментарі з вашими відповідями
Відповіді:
- ✅
- ✅
- ✅
4.
❌P p =new P(); p.m2();
Причина: Посилання на батьківський клас може бути використане для зберігання об'єкта дочірнього класу, але за допомогою цього посилання ми не можемо викликати методи, специфічні для дочірнього класу, і можемо викликати тільки ті методи, які є в батьківському класі.
Приклад 2:
A — — — -> m1() {
/|\ print("A");
| }
|
|
|
|
B — — — -> m1() {
/|\ print("B");
| }
|
|
|
|
C- - - -> m1() {
print("C");
}
C c = new C();
c.m1();
((B)c).m1();
((A)((B)c)).m1();
Залиште свої коментарі з відповідями
Відповіді:
- C
- C
- C
Чому всі відповіді C: Це перевизначення (Overriding), і резолюція методу завжди відбувається на основі об'єкта під час виконання.
Приклад 3:
A — — — -> static m1() {
/|\ print("A");
| }
|
|
| print("B");
| }
|
|
|
|
C - - - -> static m1() {
print("C");
}
C c = new C();
c.m1();
((B)c).m1();
((A)((B)c)).m1();
Залиште свої коментарі з відповідями
Відповіді:
- C
- B
- A
Чому всі відповіді різні: Це приховування методу (Method hiding), і резолюція методу завжди відбувається на основі типу посилання.
Приклад 4:
A — — — -> int x = 777;
/|\
|
|
|
|
|
B — — — -> int x = 888;
/|\
|
|
|
|
|
C - - - -> int x = 999;
C c = new C();
c.x;
((B)c).x;
((A)((B)c)).x;
Залиште свої коментарі з відповідями
Відповіді:
- 999
- 888
- 777
Чому всі відповіді різні: Резолюція змінних завжди залежить від типу посилання, а не від об'єкта під час виконання.
Перекладено з: Object Type-Casting | Part-9 | Core Java: OOPs(Object Oriented Programming)