Полиморфизм: вызов переменной подкласса «метод из суперкласса» - PullRequest
0 голосов
/ 24 сентября 2018

В Java, когда метод будет выполняться, его объявление сначала ищется в реальном классе объекта (который определяет реальный тип объекта).Если он не найден, то суперкласс проверяется.Если там тоже ничего не найдено, проверяется следующий родительский класс и так далее.Однако, посмотрите на пример ниже:

   SuperClass s = new SubClass(list of parameter);
   s.someMethodExistOnlyInSubClass();

Это даст мне ошибку времени компиляции.Я думал, что, как упомянуто выше, он сначала ищет someMethodExistOnlyInSubClass() на SubClass, проверяет, существует ли он там, а затем сразу же выполняет его.Если я использую переменную типа SuperClass для ссылки на экземпляр SubClass, некоторые параметры будут переданы конструктору SuperClass через вызов super(), и объект будет создан там.В этом контексте, куда ушли остальные параметры?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Объект создается на основе его объявленного класса.Когда вы объявляете его как SuperClass s, у объекта не будет никакого метода с именем someMethodExistOnlyInSubClass.Поэтому, когда вы пытаетесь вызвать этот метод, даже перед просмотром подкласса, вы получаете ошибку компиляции.

Объект s противоречит только всему суперклассу, этот объект не будет знать ни о каком подклассе, пока выТип приведите объект к подклассу.

0 голосов
/ 24 сентября 2018

То, что вы пытаетесь сделать, будет работать только тогда, когда метод определен как в родительском классе, так и в подклассе.

    import java.util.*;
    class Parent 
    {
        public void sample()
        {
            System.out.println("Method of parent is getting Called");
        }
    }


    class Subclass extends Parent
    {
        public void sample()
        {
            System.out.println("Method of Child class is getting Called");
        }
    }

    public class Main
    {
        public static void main(String[] args){
            Parent p = new Subclass();
            p.sample();
        }
    }

OUTPUT : Method of Child class is getting Called

Если метод существует только в дочернем классе.Вам нужно будет создать экземпляр самого дочернего класса.

Что-то вроде этого:

import java.util.*;
class Parent 
{

}

class Subclass extends Parent
{
    public void sample()
    {
        System.out.println("Method of Child class is getting Called");
    }
}

public class Main
{
    public static void main(String[] args){
        Subclass p = new Subclass();
        p.sample();
    }
}

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

Parent p = new Subclass();
((Subclass)p).sample();
0 голосов
/ 24 сентября 2018

При назначении ссылки на экземпляр SubClass переменной типа SuperClass переменная обрабатывается так, как если бы она ссылалась на экземпляр SuperClass.Следовательно, он не будет знать ни одного из методов, объявленных специально в SubClass.Обратите внимание, что переопределения, выполненные в SubClass, все еще будут эффективны.

В описанном вами контексте для доступа к someMethodExistOnlyInSubClass() вам придется привести s к типу SubClass.Смотрите ниже:

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