powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по Java Core
17 сообщений из 17, страница 1 из 1
Вопрос по Java Core
    #37870012
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.
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
Вопрос по Java Core
    #37870017
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод getA выводит переменную класса A, а не класса B, как вы ожидаете. У вас слишком замороченый пример, чтобы разобраться. Выделите из него конуретный участок, который вам не понятен и сведите его к минимуму кода.
...
Рейтинг: 0 / 0
Вопрос по Java Core
    #37870028
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.
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
Вопрос по Java Core
    #37870034
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос по Java Core
    #37870050
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExordinТакой вопрос задали моему товарищу на собеседовании.
Собеседующий в неадеквате. В реальной жизни никто не использует поля с явной не однозначностью и статическим недополиморфизмом. Таким вопросом можно кучу экспертов завалить, в том числе меня. Ну, т.е. с ходу я бы решения не выбрал. Только после долгих обдумываний.


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

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

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

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

Небойсь в жизни такого не встречается, учитывая то, что классы ,в основном, должны быть бинами, а вних и прайват поля и геттеры.
...
Рейтинг: 0 / 0
Вопрос по Java Core
    #37870060
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExordinПолучается, что если в наследниках есть переменные с такими же именами, и мы пытаемся получить их значение напрямую, то увидим только переменную суперкласса?
Нет. Компилятор связывается с конкретным полем (или статическим методом), в зависимости о того какой конкретный тип укажет программист (через переменную или приведение типа).
...
Рейтинг: 0 / 0
Вопрос по Java Core
    #37870065
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор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
Вопрос по Java Core
    #37870067
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Вопрос по Java Core
    #37870075
Exordin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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

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

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


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