Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по Java Core / 17 сообщений из 17, страница 1 из 1
07.07.2012, 12:32:02
    #37870012
Exordin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Здравствуйте, подскажите пожалуйста, глядя на это:
Код: 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.
public class C {
	public static void main(String[] args) {
		
		A obj = new C().new B();
			System.out.println(obj);
			obj.add();
			System.out.println(obj.getA());
	}
	
	////////////////////////////
	
	class B extends A{
		 private String a;

		 public void add() {
		  this.a += " add in B";
		 }

		 public B() {
			 this.a = "B constructor";
		 }
		 
		 
		 
		 @Override
		public String toString() {
			return "This is B";
		}
	}
	
	////////////////////////////
	
	class A {
		 private String a;

		 public void add() {
		  this.a += " add in A";
		 }

		 public A() {
			 this.a = "A constructor";
		 }
		 
		 @Override
			public String toString() {
				return "This is A";
			}
		 
		 public String getA(){
			 return this.a;
		 }
	}
}


Выводит:
This is B
A constructor

А я бы по всей логике ожидал строку "B constructor add in B".

Моя логика такая:
1. Конструктится обьект B (Собсно оно нам так и написало).
2. Так как B экстендит А, то сначала вызывается дефолтный конструктор класса А и инициализирует нашу Стрингу (наша стринга это стринга обьекта В, ну мы ведь с ним работаем.)
3. Потом вторая часть конструктора класса В делает своё дело.
4. На обьекте В должен вызваться метод адд.

А на самом деле получается, что мы конструктим обьект В, работаем с ним, это всё хорошо, но почему мы видим то, что лежит в переменной класса А? Откуда она взялась? штотакое?

Эксперты, подскажите пожалуйста. Я уже 8мь месяцев учу Джаву и думал что вопросы с Shadowing (если тут уместно это слово) я уже сьел. Но глядя на эту задачу моё понимание рухнуло...
...
Рейтинг: 0 / 0
07.07.2012, 12:44:13
    #37870017
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Метод getA выводит переменную класса A, а не класса B, как вы ожидаете. У вас слишком замороченый пример, чтобы разобраться. Выделите из него конуретный участок, который вам не понятен и сведите его к минимуму кода.
...
Рейтинг: 0 / 0
07.07.2012, 12:57:36
    #37870028
Exordin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Да, извиняюсь, я действительно нахомячил в коде, но вопрос не отпадает. Просто я проводил исследования, так сказать, и пытался прикрутить к коду, всё что могло бы помочь решить вопрос. Изначально код такой:
Код: 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.
public class C {
	public static void main(String[] args) {
		
		A obj = new C().new B();
			obj.add();
			System.out.println(obj.a);
	}
	////////////////////////////
	class B extends A{
		 int a;

		 public void add() {
			 a += 5;
		 }

		 public B() {
			 a = 3;
		 }
	}
	////////////////////////////
	
	class A {
		 int a;

		 public void add() {
			 a += 2;
		 }

		 public A() {
			 a = 10;
		 }
	}
}


Такой вопрос задали моему товарищу на собеседовании.

В данном случае выводит 10. Хотя я ожидаю, опять же по логике, что будет 8.
...
Рейтинг: 0 / 0
07.07.2012, 13:11:21
    #37870034
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
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.
public class C {
    public static void main(String[] args) {

        A obj = new C().new B();
        obj.add();
        System.out.println(obj.a);
        System.out.println(((B)obj).a);
    }
    ////////////////////////////
    class B extends A{
        int a;

        public void add() {
            a += 5;
        }

        public B() {
            a = 3;
        }
    }
    ////////////////////////////

    class A {
        int a;

        public void add() {
            a += 2;
        }

        public A() {
            a = 10;
        }
    }
}
...
Рейтинг: 0 / 0
07.07.2012, 13:21:02
    #37870050
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
ExordinТакой вопрос задали моему товарищу на собеседовании.
Собеседующий в неадеквате. В реальной жизни никто не использует поля с явной не однозначностью и статическим недополиморфизмом. Таким вопросом можно кучу экспертов завалить, в том числе меня. Ну, т.е. с ходу я бы решения не выбрал. Только после долгих обдумываний.


ExordinВ данном случае выводит 10. Хотя я ожидаю, опять же по логике, что будет 8.
Дело в том что поля, в отличие от методов, не обладают полиморфизмом. Как работает полиморфизм? По типу экземпляра в рантайме из списка подходящих методов находится единственный и выполняется.
Здесь (obj.a) связывание статичное во время компиляции. Единственный способ, которым компилятор может узнать нужное поле, это тип переменной. По нему именно этот вызов связывается с A.a, а не с B.a.
...
Рейтинг: 0 / 0
07.07.2012, 13:23:04
    #37870056
Exordin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Большой Синий Кит,

Я понял. Изначально, вопрос теста, правда, был не в том, что поправить нужно, а что выведет на экран. Мой товарищ сначала сказал вообще чушь, а потом подумал и сказал 8, но собеседователь сказал - 10, но не обьяснил почему.

Так вот, почему 10 а не 8?

Получается, что если в наследниках есть переменные с такими же именами, и мы пытаемся получить их значение напрямую, то увидим только переменную суперкласса?

Небойсь в жизни такого не встречается, учитывая то, что классы ,в основном, должны быть бинами, а вних и прайват поля и геттеры.
...
Рейтинг: 0 / 0
07.07.2012, 13:31:52
    #37870060
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
ExordinПолучается, что если в наследниках есть переменные с такими же именами, и мы пытаемся получить их значение напрямую, то увидим только переменную суперкласса?
Нет. Компилятор связывается с конкретным полем (или статическим методом), в зависимости о того какой конкретный тип укажет программист (через переменную или приведение типа).
...
Рейтинг: 0 / 0
07.07.2012, 13:33:52
    #37870065
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
автор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);
...
Рейтинг: 0 / 0
07.07.2012, 13:34:15
    #37870067
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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);
...
Рейтинг: 0 / 0
07.07.2012, 13:38:26
    #37870075
Exordin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Blazkowicz,

А почему так? Ведь у нас есть конкретный обьект В, а значит именно его поле нас и интересует. Почему компилятор смотрит на тип переменной, а не на сам обьект?

Ведь с методами именно так? Метод вызывается не согласно типу переменной, а согласно конкретному обьекту.
Или идти с этим вопросом... к разработчикам и учить мат часть? :)
...
Рейтинг: 0 / 0
07.07.2012, 13:42:36
    #37870079
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Потому, что у А, есть поле "а" и именно к нему и обращаются, а оно как было 10, так и осталось.
...
Рейтинг: 0 / 0
07.07.2012, 13:48:07
    #37870083
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
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
...
Рейтинг: 0 / 0
07.07.2012, 13:52:30
    #37870086
Exordin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Blazkowicz,

Я понял, просто мы посты, видать, одновременно писали.
Спасибо, всё, более-менее, прояснилось.
...
Рейтинг: 0 / 0
08.07.2012, 00:11:34
    #37870419
iPOJO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Exordin, в первом примере "private String a" убрать из В и сделать protected в А, а this. можно убрать при работе с а.
...
Рейтинг: 0 / 0
09.07.2012, 07:31:48
    #37871089
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
iPOJOExordin, в первом примере "private String a" убрать из В и сделать protected в А, а this. можно убрать при работе с а.
:) Похоже правильнее было бы заименовать эти переменные по разному, так как это абсолютно разные переменные.
...
Рейтинг: 0 / 0
01.09.2012, 23:10:25
    #37940161
umka_max
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
Таки не ясно, add() чей выполнится? B или A?
То, что поля не "полиморфны" ясно. А метод, что к чему прибавит?
...
Рейтинг: 0 / 0
02.09.2012, 16:24:12
    #37940459
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Java Core
iPOJOсделать protected в А +1
umka_maxТаки не ясно, add() чей выполнится?Очень просто проверяется:
Код: java
1.
System.out.println(obj.getClass().getSimpleName());
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по Java Core / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]