Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактный класс - существует! 
:(
    Опции темы
Royan
Дата 10.6.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



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

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class mytest {
    public static void main(String[] args) {
        BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.clearRect(0,0,5,5);
        System.exit(0);
    }
}


Для тех кто не успел понять чем я так удивлен. Во-первых, оказывается можно получить экземпляр абстрактного класса. Во-вторых, можно вызвать абстрактный метод у абстрактного класса (g.clearRect(0,0,5,5);). Лихо!
Хотелось бы услышать точку зрения знатоков


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
AntonSaburov
Дата 10.6.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Это где это ты получил экземпляр абстрактного класса ? Если ты про Graphics - то почитай еще раз про полиморфизм. И проверь класс (реальный) того, что ты получил.

Запусти ка это.

Код

import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class mytest {
    public static void main(String[] args) {
        BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        System.out.println(g.getClass());
        g.clearRect(0,0,5,5);
        System.exit(0);
    }
}

PM MAIL WWW ICQ   Вверх
Royan
Дата 10.6.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Выводится: class sun.java2d.SunGraphics2D
OKey тогда уж тем больший косяк. В доке написано BufferedImage#getGraphics() возвращает Graphics. Где есть хоть что - то, что в моем коде или в документации указывает на то, что BufferedImage#getGraphics() возвращает sun.java2d.SunGraphics2D?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
AntonSaburov
Дата 10.6.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Нет. По сути это идея интерфейса. Т.е. какой-то реальный класс реально умеет рисовать на канве витмапа. Но он должен быть наследован от Graphics, чтобы все, кто его используют могли думать, что это Graphics. И не надо ничего приводить - все работает.

Все наследники могут "прикидываться" своими родителями, что бывает удобно. Как в данном случае.
Это одна из фич ООП. Почитай что-нибудь на досуге smile
PM MAIL WWW ICQ   Вверх
Stampede
Дата 10.6.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(Royan @ 10.6.2005, 17:09)
Во-первых, оказывается можно получить экземпляр абстрактного класса. Во-вторых, можно вызвать абстрактный метод у абстрактного класса


Цитата(Royan @ 10.6.2005, 17:56)
Где есть хоть что - то, что в моем коде или в документации указывает на то, что BufferedImage#getGraphics() возвращает sun.java2d.SunGraphics2D?


Royan, ты абсолютно, совершенно, напрочь не понимаешь, как ОО концепты реализованы в Jave. Без этого в Java-программировании просто нечего делать, потому что эти понятия используются на каждом шагу. Немедленно учить азы!

Хорошим местом для старта будет евангелие для любого Java программиста - книга Брюса Эккеля Thinking in Java.

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

А вот читать - не обязательно. Можно пользоваться как справочником, то есть читать выборочно по мере необходимости. В данный момент тебе совершенно необходимо прочитать главу 7, Полиморфизм. Пока не прочтешь, даже не думай садиться что-либо кодировать smile


PM WWW   Вверх
Royan
Дата 10.6.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Цитата
Т.е. какой-то реальный класс реально умеет рисовать на канве витмапа. Но он должен быть наследован от Graphics


Блин, а ведь я действительно тупой! Думал, что в С++ такая фича не прокатит, ан нет вот код:

Код

#include <iostream>

class Base {
public:
    virtual Base* foo() = 0;   
};

/* Graphics скрыт от пользователя */
class Graphics : public Base {
public:
    Base* foo(){
        return new Graphics();
    }
};

class BufferedImage {
private:
    Graphics *g;
public:
    Base* getBase() {
        g = new Graphics();
        std::cout << "A call from BufferedImage.getBase()";
        return g->foo();
    }

    ~BufferedImage() {
        delete g;        
    }
};

int main(){
    Base *b = 0;
    BufferedImage *bi = new BufferedImage();
    b = bi->getBase();
    b->foo();
    return 0;
}



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
batigoal
Дата 10.6.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Stampede @ 10.6.2005, 19:58)
Хорошим местом для старта будет евангелие для любого Java программиста - книга Брюса Эккеля Thinking in Java.

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


На русском есть второе издание. Третье - только на английском (кажется).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
chief39
Дата 13.6.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(Lamer @ 10.6.2005, 19:31)
На русском есть второе издание. Третье - только на английском (кажется).


Ага. Здесь:
http://www.rost.ru/~sergey/tij2.exe


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.