Mir Mir Ответов: 3

Аргумент полиморфизма и возвращаемый тип


Я не могу понять, что автор имеет в виду под этим, может ли кто-нибудь объяснить мне это с помощью кода на java?

Вы можете иметь полиморфные Аргументы и возвращаемые типы.Если вы можете объявить ссылочную переменную супертипа, скажем, Animal, и назначить ей объект подкласса, скажем, Dog, подумайте о том, как это может работать, когда ссылка является аргументом метода..

Что я уже пробовал:

Может ли кто-нибудь объяснить это с помощью java - кода, пожалуйста

3 Ответов

Рейтинг:
2

OriginalGriff

Собака-это животное, и кошка тоже.
Поэтому, если вы создаете метод, который принимает параметр Animal, вы можете передать ему экземпляр Cat или Dog, но внутри метода вы можете использовать только методы и свойства, применимые к обоим видам. Meow или Bark например, методы. Вы можете позвонить Feed и (надеюсь) будет использована перегруженная версия от соответствующего вида.

Точно так же вы можете вернуть животное, кошку или собаку - но если вы это сделаете, то вы можете сохранить его только в переменной правильного типа или супертипа: метод возврата кошки может быть сохранен только в методе кошки или животного; метод возврата Собаки требует переменной собаки или животного. Если ваш метод возвращает животное, оно не может быть сохранено в переменной Cat или Dog, даже если фактический тип экземпляра правильный, поскольку система не знает, что это всегда будет так.

Код зависит от вас: это не моя домашняя работа!


Рейтинг:
2

Jon McKee

Ответ Гриффа точен но вот еще один код:

class A
{
    public void output() { System.out.println("Called A."); }
}

class B extends A
{
    /* Override isn't required. It's just for clarity purposes and depending on
     * your dev software it might give you a warning if you override something
     * without specifying @Override just in case you've done it accidentally.
    */
    @Override
    public void output() { System.out.println("Called B."); }

    public void somethingSpecificToB() { System.out.println("B only."); }
}

class C extends A 
{
    public void somethingSpecificToC() { System.out.println("C only."); } 
}

class Test
{
    public static void main(String[] args)
    {
        polymorphicParam(new A());
        polymorphicParam(new B());
        polymorphicParam(new C());

        A value = polymorphicReturn(true); //Return value is actually type 'A'
        value.output();
        value = polymorphicReturn(false); //Return value is actually type 'B'
        //Can only call output(), since we're treating what was returned as
        //an instance of class A
        value.output();
    }

    private static void polymorphicParam(A param)
    {
        //Even if the actual input class is B or C, you can still only
        //use the members defined in class A since that's what the parameter
        //type is.
        param.output();
    }

    private static A polymorphicReturn(bool createA)
    {
        if (createA)
           return new A();
        return new B();
    }
}

//Output:
// Called A.
// Called B.
// Called A.
// Called A.
// Called B.


Таким образом, здесь классы B и C все еще могут удовлетворять вызовам output() таким образом, поэтому может быть "приведено вверх" и обработано как экземпляры класса A. класс B использует свою собственную реализацию output() в то время как класс C наследует реализацию класса A.

Фактически, поскольку Java вынуждает либо переопределять, либо наследовать открытые члены от суперклассов, этот полиморфизм подтипов всегда работает. Java не позволит вам сломать его, например, изменив output() к private в подклассе.


Рейтинг:
0

Richard MacCutchan

Один из лучших способов научиться - это следовать учебникам по языку: След: изучение языка Java (учебные пособия Java™ )[^].