Nano Hash - криптовалюты, майнинг, программирование

Доступ к полям и распределение памяти для объектов в полиморфизме Java

У меня есть следующий образец кода, объясняющий образец концепции полиморфизма - Переопределение


    class Super
    {
        public int number = 1;
        public char superText='a';
        public String getColor()
        {
            return "red";
        }
    }

    class Sub extends Super
    {
        public int number = 2;
        public char subText='b';

        public String getColor()
        {
            return "blue";
        }
    }


    public class Sample2 
    {
        public static void main(String[] args)
        {
            Super supersub = new Sub();
            System.out.println( supersub.getColor() + supersub.number + supersub.superText );
        }



    }

Выход синий1.

Вопрос 1:

Метод в производном классе getColor () переопределяется, и отображается поле суперкласса.

Может ли кто-нибудь объяснить, почему числовое поле в производном классе не вызывается? т.е. вывод синий2


Вопрос 2: * ОТНОСИТЕЛЬНО РАСПРЕДЕЛЕНИЯ ПАМЯТИ *

for below object instantiation,

   Sub subobj = new Sub(); 
Memory for field 'number' is allocated in heap and the address of the Number variable is assigned to object reference, subobj.

consider below case,

Super supersub = new Sub(); 

(a) Здесь создается память для переменных, 'number and subText' в производном классе 'Sub', а адрес переменных помещается в supersub Object

когда я обращаюсь к supersub.subText, я получил ошибку, что subText не может быть разрешен.

ТАК, ПОЖАЛУЙСТА, ОБЪЯСНИТЕ ТОЧК (a), описанный выше, т.е. распределение памяти для переменных производного класса

Спасибо, Киборгз


  • вы должны хотя бы попытаться объяснить, какие, по вашему мнению, ответы ... 12.02.2013

Ответы:


1

Вопрос 1:

Отображается метод - производный класс и отображается поле суперкласса.

Может ли кто-нибудь объяснить, почему числовое поле в производном классе не вызывается? т.е. вывод синий2

Поля не могут быть переопределены. Даже если у двух классов общие отношения родитель-потомок, поля принадлежат тому классу, в котором они были определены, даже если они имеют общие имена с унаследованным полем. Другими словами, number в Sub - это совершенно другое поле, чем number в Super.

Вопрос 2: Здесь создается память для переменных, «число и субтекст» в производном классе «Sub», и адрес переменных помещается в объект supersub, когда я обращаюсь к supersub.subText, я получил ошибку, что субтекст не может быть разрешен.

Объект, хранящийся в supersub, имеет тип Sub, но компилятор этого не знает.

Поскольку Java - это статически типизированный язык, компилятор использует объявленный тип (то есть тип переменной) ссылки, потому что в большинстве реальных случаев Тип времени выполнения (тот, который очевиден в выражении new) не обязательно известен во время компиляции. Например, вы могли получить этот объект из другого метода или из двух или трех методов-кандидатов, поэтому тип среды выполнения непредсказуем.

Сохранение ссылки в переменной суперкласса означает, что вы намерены какое-то время использовать этот объект как Super. Таким образом, компилятор работает над этим вашим предполагаемым намерением. Super не гарантируется наличие только экземпляров типа среды выполнения Sub, поэтому он не может делать ожидаемых вами предположений.

При этом сохранение ссылки в той или иной переменной не изменяет объект. Если бы вы вернули объект к переменной типа, которая действительно знает о тех членах, к которым вы пытаетесь получить доступ (в вашем случае, тип Sub), вы обнаружите, что они все еще там (и они сохраняют их значения).

12.02.2013
  • Спасибо за информацию о компиляторе, она очень полезна. 12.02.2013

  • 2

    Поля в Java не вызываются и никогда не подвергаются динамическому полиморфизму диспетчеризации / времени выполнения. В вашем случае на самом деле есть два отдельных поля, которые имеют одно и то же имя: Super#number и Sub#number. Класс Sub наследует Super#number, поэтому он имеет оба, и то, к какому из них вы обращаетесь, зависит от статического типа времени компиляции переменной, через которую вы к нему обращаетесь. Это объясняет, почему subobj обращается к одному, а superobj к другому.

    12.02.2013

    3

    Может ли кто-нибудь объяснить, почему числовое поле в производном классе не вызывается?

    Это потому, что fields не полиморфны. При доступе к полям по конкретной ссылке вы получаете доступ к полю, определенному в ссылочном типе, и решение не зависит от фактического типа объекта.

    Память для поля «число» выделяется в куче, а адрес переменной Number присваивается ссылке на объект subobj.

    Нет, number - это примитивный тип int, и примитивы не размещаются в куче. Они хранятся в буквальном смысле слова. Примитивы и классы Wrapper - это разные вещи. Если бы вы использовали Integer вместо int, то вы бы создали объект на Heap, если бы значение не было в диапазоне, который кэшируется Java литеральным пулом.

    supersub.subText У меня возникла ошибка, из-за которой субтекст не может быть разрешен.

    Это можно сделать из объяснения вашего первого сомнения. Поскольку доступ к полю разрешается на основе ссылочного типа, а не фактического типа объекта. Итак, очевидно, что вы не можете получить доступ к subText по ссылке Super, поскольку это поле не является частью этого класса, а скорее подкласса.

    12.02.2013
  • Спасибо за объяснение! 12.02.2013
  • @Cyborgz .. Пожалуйста :) ROFL. И почему вы так запутались, принимая ответ. Вы можете потратить столько времени и отметить как принятый только тот ответ, который поможет вам лучше понять концепцию. Но не играйте так, принимая и отклоняя ответы. Всем плохо. 12.02.2013
  • @Cyborgz Похоже, вы немного запутались с кнопкой принятия. На этом сайте вы можете принять только один ответ на вопрос (это галочка) как правильный. Напротив, вы можете пометить несколько ответов как полезные (это стрелка вверх), если это то, что вы пытались сделать. 12.02.2013
  • Рохит и Теодорос, извините. Новичок здесь. Думаю, можно выбрать несколько вариантов ответа. Еще раз спасибо за советы! 12.02.2013
  • @Cyborgz .. Это абсолютно не проблема. Просто информировал вас. 12.02.2013

  • 4

    Просто потому, что вы не можете переопределить поля. Методы - единственное, что можно переопределить.

    12.02.2013

    5

    Вы не переопределяете переменные класса в Java: вы их скрываете. Переопределение - это, например, методы.

    12.02.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..