Недавно у меня появился некоторый опыт присвоения объектов подкласса объектам родительского класса, и я хотел бы поделиться им с вами. Но мой уровень ограничен, поэтому, пожалуйста, поправьте меня и покритикуйте.
Поближе, вот несколько небольших примеров, пожалуйста, посмотрите.
Тест первый
Родительский класс:
Подкласс:
Результат: это метод print() родительского класса — объектом в данный момент является Subclass@126b249.
На данный момент объектом является Subclass@126b249.
проиллюстрировать:
Подкласс суп=новый подкласс();
Хотя объявленный объект является объектом родительского класса, фактическое пространство памяти принадлежит объекту подкласса.
Вызывается метод public void print(), унаследованный от родительского класса, и на выходе получается разрешение имени объекта подкласса.
Вывод: объект, объявленный во время компиляции, является объектом родительского класса, но во время выполнения он является объектом подкласса. Если подкласс не переопределяет метод родительского класса, объект в это время вызывает метод, унаследованный от родительского класса.
Тест 2
Родительский класс:
Подкласс:
Результат: это метод print() подкласса — на данный момент объектом является Subclass@126b249.
На данный момент объектом является Subclass@126b249.
проиллюстрировать:
На основе предыдущего примера я переписал метод print() родительского класса. В это время вызывался метод print() подкласса.
Вывод: На основании вывода предыдущего примера я пришел к выводу: в этот момент объект при запуске действительно является объектом подкласса. Если подкласс не записывает метод родительского класса,
Затем объект в это время вызывает метод, унаследованный от родительского класса, в противном случае объект в это время вызывает метод подкласса;
Вопрос: Можем ли мы сделать следующий вывод из приведенного выше теста: присвоить объект подкласса объекту родительского класса (т. е. Supclass sup=new Subclass()),
Мы получаем объект подкласса, то есть sup - это объект подкласса??????
Тест третий
Родительский класс:
Подкласс:
Результат: Атрибуты на данный момент: атрибуты родительского класса.
Примечание. На основе первого теста я добавил атрибут className к родительскому классу и переопределил этот атрибут в подклассе.
Но когда я сейчас вывожу свойства объекта, они являются свойствами родительского класса.
Вывод: при назначении объектов подкласса объектам родительского класса методы и свойства сильно отличаются от наших традиционных отношений наследования.
вопрос:
Является ли объект в данный момент объектом подкласса или объектом родительского класса?
Начнём размышлять:
Прежде чем спекулировать, мне нужно сделать несколько замечаний:
1. Когда мы создаем новый объект подкласса, конструктор объекта родительского класса также выполняется одновременно, то есть некоторая необходимая информация родительского класса и объекта подкласса занимают одно и то же пространство памяти.
Когда мы переопределяем метод, мы можем использовать суперобъект для ссылки на родительский класс.
2. Объекты в Java не являются полностью объектно-ориентированными, то есть атрибуты и методы объекта не инкапсулируются в объект одновременно.
Но у объекта есть свои атрибуты, но метод ссылается на метод в классе. Можно сказать, что он инкапсулирует ссылки на атрибуты и методы класса в объект.
Таким образом, метод, вызываемый объектом, является не его собственным методом, а методом класса. Что касается того, почему Java делает это, я не знаю.
3. При загрузке объекта в память сначала загружается класс, а потом класс должен оставаться в памяти. Насчет того, когда класс исчезнет из памяти, я не знаю.
Я думаю, что в Java должен быть свой собственный механизм переработки, такой же, как и у объектов переработки.
4. Компиляция и запуск — это совершенно разные вещи. Основное, что вы делаете во время компиляции, — это объявляете тип объекта, присваиваете атрибуты, проверяете синтаксические ошибки и т. д.
Что делает среда выполнения, так это загружает объекты в память (обычно с использованием new, также часто используется отражение), запускает функции выполнения кода и т. д.
5. Если мы с вами, читатель, не войдем в резонанс по этим пунктам или если у нас нет одинакового понимания по этим пунктам, вы подумаете, что я говорю ерунду.
Возможно, вы подумаете, что мой экспертный балл слишком низок, и поэтому мой авторитет низкий. Но я хочу сказать, что здесь нет порядка обучения, и на первом месте стоят те, кто овладевает.
Хаха, я готов превратить свои экспертные баллы в отрицательные значения, хватит ерунды, продолжим.
Предположение:
1. Когда мы компилируем Supclass sup=new Subclass(), объект sup объявляется как класс Supclass, поэтому атрибуты объекта sup являются значениями атрибутов объекта родительского класса.
3. Продолжая с шага 2, если мы переопределим метод родительского класса, поскольку пространство памяти объекта sup является пространством памяти объекта подкласса, в память будет загружен метод подкласса public void print().
Итак, мы вызываем метод public void print() подкласса, если вам нужно вызвать переопределенный метод родительского класса, вам нужно использовать super.
Этот отрывок может объяснить тест 2.
Подведите итог:
Нижеизложенное является чисто личным мнением:
Назначьте объект подкласса объекту родительского класса, и результирующий объект будет выглядеть следующим образом:
Он компилируется как объект родительского класса, но работает как объект подкласса. Его конкретные характеристики следующие.
1. Объявлен как объект родительского класса. 2. Имеет атрибуты родительского класса. 3. Занимает пространство памяти подкласса. 4. Когда метод подкласса переопределяет метод родительского класса, объект в это время вызывает метод подкласса, в противном случае наследование выполняется автоматически; называются методами родительского класса.
5. Я думаю, что этот объект не является ни объектом родительского класса, ни объектом подкласса. Когда мы используем его методы,
Я рассматриваю его как объект подкласса; если я использую его свойства, я рассматриваю его как объект родительского класса.
Это объект, который занимает атрибуты родительского класса и использует методы подкласса. Что касается того, что это за объект, я думаю, это зависит от объявления. Его следует рассматривать как объект родительского класса, но он имеет подкласс. методы.
Подумайте об этом:
Как на основании теста 3 извлечь атрибуты подкласса? ? ? ? ?