|
|
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, подскажите пожалуйста, глядя на это: Код: 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. Выводит: This is B A constructor А я бы по всей логике ожидал строку "B constructor add in B". Моя логика такая: 1. Конструктится обьект B (Собсно оно нам так и написало). 2. Так как B экстендит А, то сначала вызывается дефолтный конструктор класса А и инициализирует нашу Стрингу (наша стринга это стринга обьекта В, ну мы ведь с ним работаем.) 3. Потом вторая часть конструктора класса В делает своё дело. 4. На обьекте В должен вызваться метод адд. А на самом деле получается, что мы конструктим обьект В, работаем с ним, это всё хорошо, но почему мы видим то, что лежит в переменной класса А? Откуда она взялась? штотакое? Эксперты, подскажите пожалуйста. Я уже 8мь месяцев учу Джаву и думал что вопросы с Shadowing (если тут уместно это слово) я уже сьел. Но глядя на эту задачу моё понимание рухнуло... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 12:32:02 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Метод getA выводит переменную класса A, а не класса B, как вы ожидаете. У вас слишком замороченый пример, чтобы разобраться. Выделите из него конуретный участок, который вам не понятен и сведите его к минимуму кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 12:44:13 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Да, извиняюсь, я действительно нахомячил в коде, но вопрос не отпадает. Просто я проводил исследования, так сказать, и пытался прикрутить к коду, всё что могло бы помочь решить вопрос. Изначально код такой: Код: 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. 27. 28. 29. 30. 31. 32. 33. Такой вопрос задали моему товарищу на собеседовании. В данном случае выводит 10. Хотя я ожидаю, опять же по логике, что будет 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 12:57:36 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Exordin, Вот ответ: Код: 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. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:11:21 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
ExordinТакой вопрос задали моему товарищу на собеседовании. Собеседующий в неадеквате. В реальной жизни никто не использует поля с явной не однозначностью и статическим недополиморфизмом. Таким вопросом можно кучу экспертов завалить, в том числе меня. Ну, т.е. с ходу я бы решения не выбрал. Только после долгих обдумываний. ExordinВ данном случае выводит 10. Хотя я ожидаю, опять же по логике, что будет 8. Дело в том что поля, в отличие от методов, не обладают полиморфизмом. Как работает полиморфизм? По типу экземпляра в рантайме из списка подходящих методов находится единственный и выполняется. Здесь (obj.a) связывание статичное во время компиляции. Единственный способ, которым компилятор может узнать нужное поле, это тип переменной. По нему именно этот вызов связывается с A.a, а не с B.a. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:21:02 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Большой Синий Кит, Я понял. Изначально, вопрос теста, правда, был не в том, что поправить нужно, а что выведет на экран. Мой товарищ сначала сказал вообще чушь, а потом подумал и сказал 8, но собеседователь сказал - 10, но не обьяснил почему. Так вот, почему 10 а не 8? Получается, что если в наследниках есть переменные с такими же именами, и мы пытаемся получить их значение напрямую, то увидим только переменную суперкласса? Небойсь в жизни такого не встречается, учитывая то, что классы ,в основном, должны быть бинами, а вних и прайват поля и геттеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:23:04 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
ExordinПолучается, что если в наследниках есть переменные с такими же именами, и мы пытаемся получить их значение напрямую, то увидим только переменную суперкласса? Нет. Компилятор связывается с конкретным полем (или статическим методом), в зависимости о того какой конкретный тип укажет программист (через переменную или приведение типа). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:31:52 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
авторA objA = new C().new B(); B objB = new C().new B(); objA.add(); objB.add(); //Определяем по типу переменной System.out.println(objA.a); System.out.println(objB.a); //Определяем по типу приведенному типу System.out.println(((B)objA).a); System.out.println(((A)objB).a); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:33:52 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:34:15 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А почему так? Ведь у нас есть конкретный обьект В, а значит именно его поле нас и интересует. Почему компилятор смотрит на тип переменной, а не на сам обьект? Ведь с методами именно так? Метод вызывается не согласно типу переменной, а согласно конкретному обьекту. Или идти с этим вопросом... к разработчикам и учить мат часть? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:38:26 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Потому, что у А, есть поле "а" и именно к нему и обращаются, а оно как было 10, так и осталось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:42:36 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
ExordinА почему так? Ведь у нас есть конкретный обьект В, а значит именно его поле нас и интересует. Почему компилятор смотрит на тип переменной, а не на сам обьект? У компилятора нет никаких объектов. Объекты появляются только в рантайме. У компилятора есть только типы переменных. ExordinВедь с методами именно так? Метод вызывается не согласно типу переменной, а согласно конкретному обьекту. Мля, ну я же написал уже выше. Методы обладают полиморфизмом. Поля и статические методы не обладают полиморфизмом (грубо говоря). http://docs.oracle.com/javase/tutorial/java/IandI/override.html http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:48:07 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я понял, просто мы посты, видать, одновременно писали. Спасибо, всё, более-менее, прояснилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2012, 13:52:30 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Exordin, в первом примере "private String a" убрать из В и сделать protected в А, а this. можно убрать при работе с а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 00:11:34 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
iPOJOExordin, в первом примере "private String a" убрать из В и сделать protected в А, а this. можно убрать при работе с а. :) Похоже правильнее было бы заименовать эти переменные по разному, так как это абсолютно разные переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 07:31:48 |
|
||
|
Вопрос по Java Core
|
|||
|---|---|---|---|
|
#18+
Таки не ясно, add() чей выполнится? B или A? То, что поля не "полиморфны" ясно. А метод, что к чему прибавит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2012, 23:10:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37870083&tid=2131031]: |
0ms |
get settings: |
16ms |
get forum list: |
24ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
60ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
111ms |
get tp. blocked users: |
3ms |
| others: | 294ms |
| total: | 546ms |

| 0 / 0 |
