В Java, каков фактический класс для переменной суперкласса, которая ссылается на ссылку на подкласс? - PullRequest
1 голос
/ 26 июня 2019

Я все еще новичок в Java, и меня немного смущает то, как Java обрабатывает переменную суперкласса, которая ссылается на ссылку на подкласс. У меня есть два класса:

public class Animal{
}
public class Dog extends Animal{
}

А потом я создал класс Run, как показано ниже:

public class Run{
    public void get_dog (Dog a){
        System.out.println("got a dog");
    }
    public static void main(String[] args) {
        Animal a_animal = new Dog(); //Create a Animal variable with Dog class
        Run test = new Run();
        System.out.println(a_animal.getClass().getSimpleName());
        test.get_dog(a_animal); //This will not run
    }
}

getClass (). GetSimpleName () сообщает мне, что класс a_animal - это Dog. Но test.get_dog (a_animal) не будет работать, говоря, что get_name () будет принимать только класс Dog вместо класса Animal. Так что же это за класс для a_animal?

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

Согласно вашему коду, вы должны передавать объект Animal в метод get_dog, а не объект Dog.То, что вы пробовали, называется апкастингом.Ссылочная переменная класса Parent ссылается на объект класса Child, как показано ниже.

 Animal a_animal = new Dog();

enter image description here

Я переписал вам код дляпонять концепцию, как показано ниже

public class Animal {
    void run() {
        System.out.println("An animal is running");
    }
}


public class Dog extends Animal {
    void run() {
        System.out.println("Dog is running in 20kmph");
    }
}



public class Run{
    public static void main(String[] args) {
        Animal a_animal = new Dog(); //Creating a reference variable of Animal class by referring to Dog class (upcasting)
        a_animal.run();//
    }
}

Ниже приведен результат

enter image description here

Пояснение

Мы вызываем метод run по ссылочной переменной класса Parent.Поскольку он ссылается на объект подкласса, а метод подкласса переопределяет метод родительского класса, метод подкласса вызывается во время выполнения.

Вызов метода определяется JVM, а не компилятором, он известен как полиморфизм времени выполнения.

1 голос
/ 26 июня 2019

Путаница здесь заключается в статической типизации в сравнении с динамической типизацией. Во время компиляции переменная a_animal известна компилятору как Animal. Попытка использовать его как Dog не удалась, потому что компилятор знает, что не все экземпляры Animal являются собаками (т.е. Animal не Dog и не является подклассом Dog).

Во время выполнения a_animal будет ссылаться на Собаку, и этот вызов будет работать. Чтобы увидеть, как это работает, измените test.get_dog(a_animal) на test.get_dog((Dog) a_animal) - этот (Dog) - это приведение, которое говорит компилятору обрабатывать a_animal как тип Dog.

1 голос
/ 26 июня 2019

Попробуйте:

 test.get_dog((Dog)a_animal); 

метод get_dog() ожидает объект Dog в качестве параметра.Поскольку ваш a_animal сначала инициализируется как класс Animal, вам необходимо явно типизировать его как объект Dog, чтобы он знал, что ваш a_animal является объектом Dog.

Выезд: полиморфизм и приведение типов в Java

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