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

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

07.10.2012, 16:31. Показов 10027. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru