Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для animator404
99 / 99 / 12
Регистрация: 05.05.2013
Сообщений: 1,208

Офигеть!

24.06.2013, 02:52. Показов 2525. Ответов 25
Метки нет (Все метки)

Каким будет результат компиляции и выполнения данного кода?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Greek{
 
     int i=1;
 
     public int getI(){
          System.out.print("Super");
          return i;
     }
 
     public static void main(String arhs[]){
          Greek ga=new Arabik();
          System.out.print(ga.i+" "+ga.getI());
     }
}
 
 
class Arabik extends Greek{
 
     int i=2;
 
     public int getI(){
          System.out.print("Sub");
          return i;
     }
 
}
Только не гуглите и не копипасте пожалуйста. Так будет не интересно. Сам долго въезжал, но все таки понял....
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
25.06.2013, 01:27
прикольно то что в моём посте выше был такой же разжёванный ответ, надо было просто внимательно читать )))
1
3 / 3 / 2
Регистрация: 04.01.2013
Сообщений: 73
06.07.2013, 01:12
Цитата Сообщение от lowercase Посмотреть сообщение
при обращении к методам учитывается фактический класс обьекта(т.е. работает полиморфизм). при обращнии к полям учитывается тип ссылки.
А почему тогда
такая запись

Java
1
2
3
4
    public static void main(String arhs[]){
        Greek ga = (Greek) new Arabik();
        System.out.print(ga.i+" "+ga.getI());
    }

ничего не меняет? Почему не получается "Super1 1" ?
0
 Аватар для animator404
99 / 99 / 12
Регистрация: 05.05.2013
Сообщений: 1,208
06.07.2013, 02:47  [ТС]
St@nton, как мне кажется (поправьте если что), эта строчка кода:
Java
1
Greek ga = (Greek) new Arabik();
эквивалентна двум:
Java
1
Greek ga = new Arabik();
То есть этим = (Greek) new Arabik(); вы никак не навредили использовать объекту ga структуру класса Greek, а реализацию класса Arabik.

Добавлено через 7 минут
И еще, как мне кажется, при таком (Greek) new Arabik(); преобразовании ничего особо не происходит, потому что у класса Arabik есть метод getI() как и у Greek, пусть и переопределенный.
0
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
06.07.2013, 11:56
Цитата Сообщение от St@nton Посмотреть сообщение
А почему тогда
такая запись

Java
1
2
3
4
    public static void main(String arhs[]){
        Greek ga = (Greek) new Arabik();
        System.out.print(ga.i+" "+ga.getI());
    }

ничего не меняет? Почему не получается "Super1 1" ?
Greek ga = (Greek) new Arabik();
ga - переменная типа Greek ссылающаяся на адрес в памяти
new Arabik() - создание нового объекта типа Arabik
Тип объекта после создания не меняется, приведением типов((Greek) new Arabik()) в том числе. В итоге в с равнении с изначальным кодом, ничего не изменилось: переменная ga по прежнему типа Greek, объект на который она ссылается типа Arabik. Зачем тогда вообще разрешено приведение объектных типов - чтобы скрывать/давать доступ к полям и методам классов:
System.out.println(ga.i); //1
System.out.println(((Arabik)ga).i); //2

Добавлено через 7 минут
System.out.println(ga.i); //1, так как вызывается i класса Greek
System.out.println(((Arabik)ga).i); //2, так как вызывается i класса Arabik
Для класса Arabik - обе i храняться в памяти, а доступ к той или другой зависит от типа переменной через которую идет обращение
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.07.2013, 12:03
Цитата Сообщение от MaxNevermind Посмотреть сообщение
Зачем тогда вообще разрешено приведение объектных типов - чтобы скрывать/давать доступ к полям и методам классов:
это сделано для того чтобы при наследовании пользоваться всеми реализациями через единый интерфейс не заботясь о реализации.
Именно поэтому в бинах есть такое понятие как гетер и сетер, если у вас есть своя переменная i и вы хотите чтобы каст не приводил к тому что вы описали, вы пользуетесь не полями напрямик а через гетер, в котором

Java
1
2
3
int getI() {
 return this.i;
}
1
3 / 3 / 2
Регистрация: 04.01.2013
Сообщений: 73
11.07.2013, 20:43
Цитата Сообщение от MaxNevermind Посмотреть сообщение
Тип объекта после создания не меняется, приведением типов в том числе
Цитата Сообщение от mutagen Посмотреть сообщение
если у вас есть своя переменная i и вы хотите чтобы каст не приводил к тому что вы описали..
Хе) Супер!) Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru