Изучая Java, я столкнулся с понятием полиморфизма. У меня есть склонность схватывать основополагающие принципы, прежде чем углубляться в их практическое использование, поэтому я задокументировал здесь свою интерпретацию.
Первоначальное значение полиморфизма — «разнообразие». Однако в контексте этой статьи это относится к способности переменной хранить объекты разных типов, пока существует связь посредством наследования классов или реализации интерфейса, без возникновения ошибок.
Как правило, тип переменной соответствует типу объекта, на который она ссылается.
Animal animal = new Animal();
Однако, когда объект расширяет класс, переменную можно рассматривать как тип суперкласса.
Animal animal = new Dog(); // Dog extends Animal
Кроме того, если объект реализует интерфейс, его можно рассматривать как тип интерфейса.
// Interface definition interface Animal { void makeSound(); // Method in the interface } // Classes implementing the interface class Dog implements Animal { public void makeSound() { System.out.println("Woof!"); // Dog-specific implementation } } class Cat implements Animal { public void makeSound() { System.out.println("Meow!"); // Cat-specific implementation } } // Main method public class Main { public static void main(String[] args) { // Assign objects to variables of the interface type Animal myDog = new Dog(); Animal myCat = new Cat(); // Call the interface method myDog.makeSound(); // Outputs "Woof!" myCat.makeSound(); // Outputs "Meow!" } }
Это позволяет нам обрабатывать разные классы как один и тот же тип, обеспечивая гибкое кодирование.
При обсуждении того, чем отличаются тип переменной и тип объекта, возникает вопрос: что такое «тип»? На основе моего анализа я пришел к выводу, что тип служит следующим целям:
Ссылка на предыдущий пример:
Animal animal = new Dog(); // Dog extends Animal
Это означает, что память выделена для Dog, но переменная интерпретирует содержимое как Animal. Эту концепцию можно визуализировать следующим образом:
Тип действует как линза-фильтр, определяя, как воспринимаются данные. Изменяя объектив, вы можете сосредоточиться на общих методах суперкласса или конкретных методах через интерфейсы.
Можно задаться вопросом, почему мы не всегда объявляем переменные в суперклассе, если преимуществом полиморфизма является обработка общих методов во всех классах. Причина в том, что в таких случаях память выделяется только для данных суперкласса.
Хотя можно привести подкласс к суперклассу (повышенное преобразование), обратное неверно. Это связано с тем, что подкласс включает в себя данные суперкласса, а также свои собственные уникальные данные. Таким образом, память предварительно выделяется для подкласса, что позволяет использовать методы, специфичные для подкласса, посредством повышающего преобразования.
Интерфейсы также действуют как типы, и их роль фильтрующих линз для обработки данных, хранящихся в памяти объекта, концептуально аналогична роли классов. Методы, вызываемые через интерфейс, определяются типом объекта, а не типом переменной (динамическая привязка). Это подтверждает идею о том, что тип переменной действует просто как фильтр, позволяя нам использовать отфильтрованные данные.
Полиморфизм полезен в сценариях, где необходимо унифицировать общие процессы, одновременно используя индивидуальные характеристики. В результате моего исследования я лучше понял, что, хотя расположение объекта в памяти по-прежнему определяется его типом, тип переменной контролирует интерпретацию этой памяти — для меня это важное осознание.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3