Путаница в Java Полиморфизм относительно вызова метода - PullRequest
0 голосов
/ 28 января 2020

У меня проблемы с этим Java Вопрос :

Рассмотрим следующие классы:

​
public class Computer extends Mineral {
    public void b() {
        System.out.println("Computer b");
        super.b();
    }

    public void c() {
        System.out.println("Computer c");
    }
}
​
public class Mineral extends Vegetable {
    public void b() {
        System.out.println("Mineral b");
        a();
    }
}
​
public class Animal extends Mineral {
    public void a() {
        System.out.println("Animal a");
    }

    public void c() {
        b();
        System.out.println("Animal c");
    }
}
​
public class Vegetable {
    public void a() {
        System.out.println("Vegetable a");
    }
​
    public void b() {
        System.out.println("Vegetable b");
    }
}

Предположим определены следующие переменные:

Vegetable var1 = new Computer();
Mineral   var2 = new Animal();
Vegetable var3 = new Mineral();
Object    var4 = new Mineral();

Укажите в каждой строке под выводом, полученным каждым показанным оператором. Если оператор выдает более одной строки вывода, укажите разрывы строк с косой чертой, как в / b / c, чтобы указать три строки вывода, после которых следует b, а затем c. Если оператор вызывает ошибку, напишите слово error, чтобы указать это.

Для выполнения

var1.b()

Я был озадачен выводом

Через тщательный анализ, мы должны заметить, что когда мы вызываем метод b () для минерала:

public void b() {
        System.out.println("Mineral b");
        a();
    }

Мы также вызываем метод

a()

И, следовательно, используя диаграмму иерархии классов , можно вызвать метод

Vegetable.a()

источник

1 Ответ

2 голосов
/ 29 января 2020

В Vegetable var1 = new Computer(); у вас есть ссылочная переменная типа Vegetable, указывающая на объект типа Computer. Присвоение допустимо, если Vegetable - супер-тип компьютера.

Выражение var1.b() будет допустимым (этап компиляции), если тип ссылочной переменной (Vegetable) имеет метод b() , Если тип Vegetable не имеет метода b(), то выражение выдаст ошибку компиляции.

Если компиляция пройдет: в время выполнения , вызов var1.b() вызовет b() метод объекта, на который указывает переменная var1 (то есть экземпляр типа Computer). Computer.b() переопределяет Mineral.b(), так что метод будет вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...