Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 19.01.2016
Сообщений: 23

Брюс Эккель Философия Java 2015. Полиморфизм

19.04.2016, 13:20. Показов 2275. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане.
В книге (страница 248) есть такой простенький пример кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Super {
    public int field = 0;
    public int getField() {return field;}
}
 
class Sub extends Super{
    public int field = 1;
    public int getField(){return field;}
    public int getSuperField(){return super.field;}
}
 
public class FieldAccess {
    public static void main(String[] args){
        Super sup = new Sub();
        System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
        Sub sub = new Sub();
        System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField());
    }
}
Далее по тексту книги: ...При этом версия Super не используется по умолчанию, при обращении к полю в Sub; что бы получить доступ к полю из Super, необходимо использовать явную запись super.field....


Правильно ли я понимаю: компилятор смотрит, что ссылка на Sub имеет тип Super и поэтому в первой строке вывода он выдаёт значение поля field именно из Super?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2016, 13:20
Ответы с готовыми решениями:

Брюс Эккель - Философия Java
Здравствуйте. Хочу приобрести книгу Брюса Эккеля - Философия java. Но есть две книги: 1. 4 Издание(680 стр) 2. 4 Полное издание(1150...

Эккель Б. - Философия Java
Не могу понять что от меня требуется. помогите пожалуйста . Правила форума

Философия java. Актуальность материала
Меня интересует актуальность этой книги. Какие главы стоит читать, какие нет?

8
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
19.04.2016, 16:34
Надеюсь не искажу действительность, я понимаю это так: всегда будет вызываться метод того типа, который реально был создан, т.е.
*если вы в переменную типа Super записываете ссылку на объект типа Sub, то будут использоваться методы типа Sub.
*если вы в переменную типа Sub записываете ссылку на объект типа Sub, то будут использоваться методы типа Sub.
0
1 / 1 / 0
Регистрация: 19.01.2016
Сообщений: 23
19.04.2016, 19:06  [ТС]
Речь идет о полях.

Вывод данного кода:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1

Получается, что значение поля берётся из базового класса(Super), а метод используется потомка(Sub).

В книге по этому поводу сказано:...При этом версия Super не используется по умолчанию при обращении к полю в Sub; чтобы получить доступ к полю из Super, необходимо использовать явную запись super.field.

Результат работы кода противоречит книге....или я что то не так понял?
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
20.04.2016, 18:37
Лучший ответ Сообщение было отмечено dikson как решение

Решение

Цитата Сообщение от dikson Посмотреть сообщение
Результат работы кода противоречит книге....или я что то не так понял?
Возможно перевод косячный или еще что. Вообще это хорошая книга.
Суть в следующем - в Java вызов методов всегда полиморфен, в отличии от обращения к полям, что и доказывает результат работы этого примера.

Добавлено через 42 секунды
Цитата Сообщение от dikson Посмотреть сообщение
Правильно ли я понимаю: компилятор смотрит, что ссылка на Sub имеет тип Super и поэтому в первой строке вывода он выдаёт значение поля field именно из Super?
да, именно так
1
0 / 0 / 0
Регистрация: 14.04.2016
Сообщений: 8
23.04.2016, 01:08
Всем привет. Кто-нибудь может сказать, в чем смысл создания объекта супер-класса конструктором из класса-наследника?
Java
1
2
        Super sup = new Sub();
        Sub sub = new Sub();
Зачем это делать, если можно вызвать конструктор класса-наследника? Есть ли примеры из рабочей практики, где и зачем применяется такой подход и в чем может быть его приемущество или необходиомсть?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.04.2016, 01:41
Цитата Сообщение от PaulV Посмотреть сообщение
Зачем это делать, если можно вызвать конструктор класса-наследника? Есть ли примеры из рабочей практики, где и зачем применяется такой подход и в чем может быть его приемущество или необходиомсть?
классический пример:
Есть суперкласс фигура Shape с методом нахождения площади double square
Мы создаем кучу разных наследников со своей реализацией того метода (треугольник, круг, квадрат, фигурка котенка) т.е. они умеют находить свою площадь.

Теперь у нас есть огромный массив фигур new Shape[100500] не важно каких именно. Мы просто можем на каждый из них вызвать метод square и найти площадь. Ну или в цикле в 1 строку практически найти общую площадь.

Без суперкласса пришлось бы создавать для каждого наследника отдельный массив.

PS: это маленькая часть возможного использования. Так же без этого нельзя было бы использовать кучу паттернов (фабрика например). Интерфейсы из той же оперы, это вообще отдельная тема, но очень активно используется.
0
0 / 0 / 0
Регистрация: 14.04.2016
Сообщений: 8
23.04.2016, 12:25
Цитата Сообщение от КОП Посмотреть сообщение
Теперь у нас есть огромный массив фигур new Shape[100500] не важно каких именно.
Это вызов конструктора супер-класса. Или после этого из любого элемента массива можно вызывать конструктор класса-наследника?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.04.2016, 13:18
Цитата Сообщение от PaulV Посмотреть сообщение
Это вызов конструктора супер-класса.
не совсем, это просто создание массива. конструктор же создает конкретный объект
Цитата Сообщение от PaulV Посмотреть сообщение
после этого из любого элемента массива можно вызывать конструктор класса-наследника?
да, однако методы можно использовать только от Shape, т.е. общие для всех фигур. Например у круга можно узнать его радиус, у квадрата - нет. Поэтому для площади просто вызываем square, но для радиуса надо будет сначала проверить фигуру, является ли она кругом, привести к нему и только тогда вызывать метод.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.04.2016, 19:15
Если нет понимания как это работает, можете почитать как устроен вызов виртуальных функций в С++, это даст понимание. В Java все методы являются виртуальными и там практически такой же механизм.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2016, 19:15
Помогаю со студенческими работами здесь

Пожалуйста какую книгу по java начать читать:Шилдт×Эккель×Хорстманн-Корнелл?для новичка который ничего в этом
знаю шарп с винапи.решил и java обучиться.понял 3 лидера книг.но какая из 3х новичку будет понятна?

Итератор. Задание из книги "Thinking in Java". Брюс Эккель
Взялся выполнить следующее задиние из книги "Thinking in Java": Напишите метод, который использует Iterator для перебора Collection и...

Философия java 3-е издание
Собствено интересует сабж - может у кого завалялось отсканированная книга? Интересует именно 3-е, а не 4-ое издание, на русском языке.

Философия Java, ответы
Привет всем! Может у кого то ест ответы к заданиям с книги Филослфия Java? Буду оч признателен :thank_you::drink:

Полиморфизм в Java
Добрый вечер. Изучая полиморфизм в Java натолкнулся на такой пример: class A { void m1(A a) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru