Типове перетворення об’єктів | Частина-9 | Основи Java: ООП (Об’єктно-орієнтоване програмування)

pic

Типове приведення об'єктів | Частина-9 | Основи Java: ООП (Object Oriented Programming) | автор: Сахіл Хамірані

  • Ми можемо використовувати посилання на батьківський клас для зберігання об'єкта дочірнього класу.

Приклад:

Object o = new String(“Sahil”);

  • Ми можемо використовувати посилання на інтерфейс для зберігання об'єкта реалізованого класу.

Приклад:

Runnable r = new Thread();

pic

Синтаксис типового приведення об'єктів | автор: Сахіл Хамірані

Мантра 1 (Перевірка на етапі компіляції 1):

  • Типи ‘d’ і ‘C’ повинні бути пов’язані між собою або як батько і син, або як однаковий тип. В іншому випадку виникне помилка на етапі компіляції.

Помилка на етапі компіляції:

pic

Несумісні типи | автор: Сахіл Хамірані

Приклад 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’. В іншому випадку виникне помилка на етапі компіляції.

Помилка на етапі компіляції:

pic

Несумісні типи | автор: Сахіл Хамірані

Приклад 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;

Тепер я надаю приклади, щоб ви вирішили їх самостійно і залишили коментарі без перегляду наданих відповідей.

pic

Типове приведення об'єктів | автор: Сахіл Хамірані

Base2 b = new Derv4();

Приклади:

  1. Object o = (Base2)b;
  2. Object o = (Base1)b;
  3. Object o = (Der3)b;
  4. Base2 b1 = (Base1)b;
  5. Base1 b1 = (Der4)b;
  6. Base1 b1 = (Der1)b;

Відповіді:

  1. ❌ // Помилка на етапі компіляції: Несумісні типи
  2. ❌ // Виняток під час виконання: ClassCastException
  3. ❌ // Помилка на етапі компіляції: Несумісні типи
  4. ❌ // Помилка на етапі компіляції: Несумісні типи
  5. ❌ // Помилка на етапі компіляції: Несумісні типи
  • Строго кажучи, через приведення типів ми не створюємо новий об'єкт.
  • Для існуючого об'єкта ми надаємо посилання іншого типу, тобто виконуємо приведення типів, але не кастинг об'єкта.

Приклад 1:

pic

Типове приведення об'єктів | Приклад 1 | автор: Сахіл Хамірані

Приклад 2:

pic

Типове приведення об'єктів | Приклад 2 | автор: Сахіл Хамірані

pic

Примітка щодо типового приведення об'єктів | автор: Сахіл Хамірані

Приклад 1: Розглянемо наступний код, які з цих методів є дійсними:

P — — — -> m1()  
|  
|  
|  
C — — — -> m2()

C c = new C();

  1. c.m1();
  2. c.m2();
  3. ((P)c).m1();
  4. ((P)c).m2();

Залиште коментарі з вашими відповідями

Відповіді:


  1. 4.
    P p =new P(); p.m2();

Причина: Посилання на батьківський клас може бути використане для зберігання об'єкта дочірнього класу, але за допомогою цього посилання ми не можемо викликати методи, специфічні для дочірнього класу, і можемо викликати тільки ті методи, які є в батьківському класі.

Приклад 2:

A — — — -> m1() {  
/|\ print("A");  
 | }  
 |  
 |  
 |  
 |  
 B — — — -> m1() {  
/|\ print("B");  
 | }  
 |  
 |  
 |  
 |  
 C- - - -> m1() {  
 print("C");  
 }

C c = new C();

  1. c.m1();
  2. ((B)c).m1();
  3. ((A)((B)c)).m1();

Залиште свої коментарі з відповідями

Відповіді:

  1. C
  2. C
  3. C

Чому всі відповіді C: Це перевизначення (Overriding), і резолюція методу завжди відбувається на основі об'єкта під час виконання.

Приклад 3:

A — — — -> static m1() {  
/|\ print("A");  
 | }  
 |  
 |  
 | print("B");  
 | }  
 |  
 |  
 |  
 |  
 C - - - -> static m1() {  
 print("C");  
 }

C c = new C();

  1. c.m1();
  2. ((B)c).m1();
  3. ((A)((B)c)).m1();

Залиште свої коментарі з відповідями

Відповіді:

  1. C
  2. B
  3. A

Чому всі відповіді різні: Це приховування методу (Method hiding), і резолюція методу завжди відбувається на основі типу посилання.

Приклад 4:

A — — — -> int x = 777;  
/|\   
 |  
 |  
 |  
 |  
 |  
 B — — — -> int x = 888;  
/|\   
 |  
 |  
 |  
 |  
 |  
 C - - - -> int x = 999;

C c = new C();

  1. c.x;
  2. ((B)c).x;
  3. ((A)((B)c)).x;

Залиште свої коментарі з відповідями

Відповіді:

  1. 999
  2. 888
  3. 777

Чому всі відповіді різні: Резолюція змінних завжди залежить від типу посилання, а не від об'єкта під час виконання.

Перекладено з: Object Type-Casting | Part-9 | Core Java: OOPs(Object Oriented Programming)

Leave a Reply

Your email address will not be published. Required fields are marked *