Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/47: Рейтинг темы: голосов - 47, средняя оценка - 4.51
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28

Приведение класса родителя к классу потомку java

07.10.2012, 16:31. Показов 10060. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся на такой кусок кода в книге Хорстмана
Java
1
2
3
4
5
6
7
8
9
10
 public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 =(Graphics2D) g;
 
        //Рисование всех квадратов
        for (Rectangle2D r: squares)
            g2.draw(r);
 
    }
И собственно интересует, как это возможно привести предка к клласу потомку Graphics2D g2 =(Graphics2D) g;. Ведь у предка нет, всех методов, и свойств потомка?
Объясните, пожалуйста, а то я не могу понять. как так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2012, 16:31
Ответы с готовыми решениями:

Наследование. Каким образом через ссылку на класс-родитель можно получить доступ к классу-потомку?
"Ведь по ссылке на объект базового класса можно обращаться к объекту производного класса, т.е. к объекту, на который ссылается переменная...

Передать значение члена класса потомку
#include <iostream> #include <locale.h> #include <fstream> #include <conio.h> #include <ctime> using namespace std; class...

Типы классу. Приведение. С++
Для приведения от пользовательского типа в основной тип используется: 1. Перегруженный оператор = 2. Конструктор с одним параметром ...

11
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
07.10.2012, 18:23
на самом деле там немного сложнее иерархия и в вашем примере фигурируют 2 абстрактных класса, а вот уже их имплементацию (которая скрыта от вас) апкастят либо к одному либо к другому
1
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28
07.10.2012, 19:50  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
на самом деле там немного сложнее иерархия и в вашем примере фигурируют 2 абстрактных класса, а вот уже их имплементацию (которая скрыта от вас) апкастят либо к одному либо к другому
А можно, поподробней?
Потому что в документации, я нашел только такое объявление класса
This Graphics2D class extends the Graphics class to provide more sophisticated control over geometry, coordinate transformations, color management, and text layout. This is the fundamental class for rendering 2-dimensional shapes, text and images on the Java(tm) platform.
Разве, не "по правилам", что только предок, может каставаться к родителю?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
07.10.2012, 22:26
Цитата Сообщение от BEST13 Посмотреть сообщение
Разве, не "по правилам", что только предок, может каставаться к родителю?
они в этом случае оба предки а класс который их имплементирует наследник Graphics2D, поэтому привести можно либо к Graphics2D, либо повыше к Graphics.
1
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28
07.10.2012, 22:52  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
они в этом случае оба предки а класс который их имплементирует наследник Graphics2D, поэтому привести можно либо к Graphics2D, либо повыше к Graphics.
Что-то не совсем понял, ведь имплементирует это реализовать, верно?
Но, разве это имеет отношение к наследованию? Ведь Graphics2D более узкий класс, Graphics шире, и мі не можем из более абстрактного, сделать более специализированный, даже если у них реализованы одинаковые интерфейсы и наверняка они тоже наследуются от родителя потомку.

Прошу извинения, если я говорю, бред, я недавно начал изучать Java. буду благодарен, за объяснения
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.10.2012, 00:04
Цитата Сообщение от BEST13 Посмотреть сообщение
Ведь Graphics2D более узкий класс, Graphics шире
С чего Вы так решили, Graphics2D наследует Graphics, в нем есть всё что в родителе.
Java
1
2
3
java.lang.Object
  extended by java.awt.Graphics
      extended by java.awt.Graphics2D
методы из Graphics2D унаследованные от Graphics
Methods inherited from class java.awt.Graphics
clearRect, clipRect, copyArea, create, create, dispose, drawArc, drawBytes, drawChars, drawImage, drawImage, drawImage, drawImage, drawImage, drawImage, drawLine, drawOval, drawPolygon, drawPolygon, drawPolyline, drawRect, drawRoundRect, fillArc, fillOval, fillPolygon, fillPolygon, fillRect, fillRoundRect, finalize, getClip, getClipBounds, getClipBounds, getClipRect, getColor, getFont, getFontMetrics, getFontMetrics, hitClip, setClip, setClip, setColor, setFont, setPaintMode, setXORMode, toString
1
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28
08.10.2012, 18:52  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
С чего Вы так решили, Graphics2D наследует Graphics, в нем есть всё что в родителе.
Java
1
2
3
java.lang.Object
  extended by java.awt.Graphics
      extended by java.awt.Graphics2D
Так я не спорю, я говорю, о том что, класс родитель (Graphics) не может восприниматься, как класс потомок (Graphics2D) , а можно только наоборот.
Вот что именно мне не понятно.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.10.2012, 19:42
Цитата Сообщение от BEST13 Посмотреть сообщение
класс родитель (Graphics) не может восприниматься, как класс потомок (Graphics2D) , а можно только наоборот.
Они оба абстрактные и их имплементирует ещё какой то там класс, вот его можно привести к любому из них. сами же Graphics и Graphics2D нельзя инстанциировать и поэтому они не выступают в роли родитель потомок, они оба в данном случае предки.
Вот если бы имплементирующий класс наследовал только Graphics, вот тогда бы его нельзя было бы привести к Graphics2D, но так как реальным классом наследуется Graphics2D, то это становится возможным.
1
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28
08.10.2012, 22:01  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
Они оба абстрактные и их имплементирует ещё какой то там класс, вот его можно привести к любому из них. сами же Graphics и Graphics2D нельзя инстанциировать и поэтому они не выступают в роли родитель потомок, они оба в данном случае предки.
Вот если бы имплементирующий класс наследовал только Graphics, вот тогда бы его нельзя было бы привести к Graphics2D, но так как реальным классом наследуется Graphics2D, то это становится возможным.
Почти, понял, а разве возможно в джаве множественное наследование ?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.10.2012, 22:32
Цитата Сообщение от BEST13 Посмотреть сообщение
Почти, понял, а разве возможно в джаве множественное наследование ?
нет, но в данном случае нет множественного, Graphics2D наследует Graphics
1
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2012, 11:38
Цитата Сообщение от BEST13 Посмотреть сообщение
Так я не спорю, я говорю, о том что, класс родитель (Graphics) не может восприниматься, как класс потомок (Graphics2D) , а можно только наоборот.
Вот что именно мне не понятно.
Да, это так. Только в этом случае приведение типа не нужно, экземпляр Graphics2D по любому может быть использован как экземпляр Graphics, просто по принцину наследования.

Там другое. На самом деле в этот метод передается экземпляр класса Graphics2D, несмотря на то, что в сигнатуре стоит Graphics. Единственное исключение - отладочный режим, когда в метод передается DebugGraphics, унаследованный от Graphics. У Oracle даже баг на эту тему зарегистрирован, правда с совсем низким приоритетом.

Ну а поскольку реально тип Graphics2D - к нему можно и привести. По большому счету, конечно, стоило проверять переданный параметр через instanceof и только тогда приводить. Но многие среды разработки автоматически приводят тип и дают использовать все методы.
1
3 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 28
09.10.2012, 18:01  [ТС]
Skipy, mutagen, Спасибо, за разъяснения ,теперь все понятно!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2012, 18:01
Помогаю со студенческими работами здесь

Приведение типа к другому классу
Предположим есть класс class A { char a; void foo(); }; можно ли делать так class B: public A

Приведение TextView к своему классу
public class MyTv extends TextView{ int place = -1; public MyTv(Context context) { super(context); } ...

ООП. Динамическое приведение типа от родителя к наследнику
Добрый день, коллеги. Проблема в следующем. Есть два библиотечных класса (xerces). 1) DOMElement class DOMElement : public DOMNode ...

Наследование от protected класса: будут ли public члены класса Б доступны классу А
Добрый день! Если пронаследовать public класс А от protected класса Б, будут ли public члены класса Б доступны классу А, и доступны...

Вызов слота класса потомка при вызове сигнала класса родителя
Всем привет. Ситуация следующая. Есть класс родитель "class1". В нём объявлен и вызывается сигнал "signal". Есть класс...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru