Сегмент кода относительно полиморфизма. Почему следующее приводит к ошибке компиляции? - PullRequest
0 голосов
/ 08 марта 2019

Почему следующий код приводит к ошибке компиляции?Поскольку это объект GeeksforGeeks, не следует ли использовать метод getValue (), найденный в классе GeeksforGeeks.Я добавил метод getValue () в базовый класс и скомпилировал код.В чем причина этого?

class GFG 
{ 
    protected void getData() 
    { 
        System.out.println("Inside GFG"); 
    } 
} 

class GeeksforGeeks extends GFG 
{ 
    protected void getData() 
    { 
        System.out.println("Inside GeeksforGeeks"); 
    } 

    protected void getValue() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
        GFG obj = new GeeksforGeeks(); 
        obj.getValue(); 
    } 
}

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Это потому, что ссылочная переменная obj имеет тип GFG, и этот класс не имеет getValue() метода.Если вы измените опорную переменную на GeeksForGeeks, она будет работать.

0 голосов
/ 08 марта 2019

Вы объявляете obj как GFG объект.GFG не не содержит метод getValue().

Важно понимать, что родительские объекты не наследуются от своих детей.Итак, в то время как GeeksForGeeks равно a GFG, GFG равно , а не a GeeksForGeeks (точно так же, как Buick равно a Car, но не каждый Car является Buick).

Обновите свою строку до GeeksForGeeks obj = new GeeksForGeeks(); или переместите метод getValue() в свой класс GFG, и вы окажетесь прямо как дождь.


Вы должны немного подумать о своем дизайне.Будет ли у каждого класса, который расширяет GFG, метод getValue()?Если это так, и все они будут делать то же самое, этот метод принадлежит классу GFG.

Предположим, однако, что вы хотите, чтобы каждый дочерний элемент GFG запускал свой собственный код, когда getValue() называется.Тогда вы все равно захотите объявить getValue() в GFG, но вы переопределите его в своем GeeksForGeeks классе:

@Override
public void getValue(){
    // Code here
}

Это слишком упрощенное объяснение наследования, но оно должно привести вас кв правильном направлении, поскольку по этому предмету можно многому научиться.

Примечание: Ваш метод getValue() на самом деле return ничего не делает;это было бы запутанной реализацией;что звонящий "получает" из метода?

0 голосов
/ 08 марта 2019

Проблема здесь в том, что метод getValue() существует только в подклассе GeeksForGeeks, но не в родительском классе CFG. И в своем коде вы определяете obj как тип родительского класса.

Одно из исправлений здесь - просто дать CFG a getValue() метод:

class GFG {
    protected void getData() {
        System.out.println("Inside GFG");
    }

    protected void getValue() {
        // do something
    }
}

Добавив любую реализацию для getValue() в класс CFG, вы завершите цепочку наследования, и Java должна затем вызвать перегруженную версию в подклассе GeeksForGeeks.

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