@WTFAYD

Как ответить на вопрос по поводу полиморфизма в Java?

Здравствуйте!
Задание звучит так:
Create a base class with two methods. In the first method, call the second method. Inherit a class and override the second method. Create an object of the derived class, upcast it to the base type, and call the first method. Explain what happens.

Есть код:
import static net.mindview.util.Print.*;

class A {
    void a() {
        b();
    }
    void b() {
       print("A.b()");
    }
}

class B extends A {
    @Override void b() {
        print("B.b()");
    }
}

public class Program {
    static public void main(String[] args) {
        A aa = new B();
        aa.a();
    }
}


Вывод:
B.b()


Как объяснить, что в итоге произошло? Произошло восходящее преобразование к базовому классу, вызов метода a() базового класса, и, внутри этого метода, переопределенного метода b() - я прав?
  • Вопрос задан
  • 734 просмотра
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Может быть так проще будет?
Класс В наследует методы и переменные класса A. И когда мы вызываем метод объект В, то он может использовать методы и переменные объекта А, также можно представить объект В, как объект А, но поведение будет все равно, как у объекта В.
В моем примере произошел вызов переопределённого метода b класса B с последующим вызовом родительского оригинального метода класса A. Причем видно, что принудительная кастенация (приведение типов) класса В к классу А - ничего не меняет, как был объект класса В, так он и остался, с переопределённым методом.
И еще, объектом обычно называют экземпляр класса, то, что образовалось после new.
package jtests;
import java.lang.System;

public class MyTest {

	class A {
		String  a () {
			return("from A:a");
		}
		String b() {		
			return("from A:b - " + a());
		}
		
	}
	class B extends A {
		@Override String b() {
			return ("from B:b - " + super.b());
		}
	}
	
	public static void main(String[] args) {
		MyTest m = new MyTest();
				
		System.out.println("A");
		A a =  m.new A(); // Используем A
		System.out.println(a.getClass().getName() + " * " + a.b());
		
		System.out.println("B");
		B b =  m.new B(); // Используем B
		System.out.println(b.getClass().getName() + " * " + b.b());
		
		System.out.println("B -> A");		
		A ab = (A) m.new B(); // Используем B как A
		System.out.println(ab.getClass().getName() + " * " + ab.b());
	}
}


И Вывод:
A
jtests.MyTest$A * from A:b - from A:a
B
jtests.MyTest$B * from B:b - from A:b - from A:a
B -> A
jtests.MyTest$B * from B:b - from A:b - from A:a
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Sanan07
@Sanan07
Писатель-прозаик
В Java методы вызываются по типу объекта, и т.к. второй метод был переопределен, то он и вызвался.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы