Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / статические поля в java / 4 сообщений из 4, страница 1 из 1
16.04.2013, 00:49:47
    #38226795
miklouha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
статические поля в java
всем доброй ночи,
у меня такой вопрос...есть класс A
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class A extends B
	{
		private    String a; 
 
		public A() {}
				
		public A(String a)
			{
				this.a = a;
			}
		
		public methodA()
			{  	 
				 System.out.println(a);
			}

		public void superA()
	 		{ 
				System.out.println(a);
			}
	} 


который наследуется от B. У класса А одно поле a, два конструктора, один собственный метод methodA и один унаследованный от класса B метод superA. Я создаю объект класса А вызывая конструктор А: A newA = new A("123") и инициализируя поле a значением "123". Но в этом случае System.out.println(a) в унаследованном методе methodA вернет null. Чтобы вернуло значение "123" поле a в классе A должно быть объявлено как static.
Почему так происходит не могу понять?
...
Рейтинг: 0 / 0
16.04.2013, 01:04:05
    #38226803
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
статические поля в java
покажи класс В.
...
Рейтинг: 0 / 0
16.04.2013, 06:34:46
    #38226846
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
статические поля в java
miklouha,

Такое может быть, если у тебя класс В выглядит вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class B {
    
    public B(){
	superA();
    }

    public void superA() {
    }

}



Т.е. ты в конструкторе базового класса вызываешь полиморфный метод (в твоем случае superA() ). Такое странное поведение объясняется немного необычным порядком инициализации.
Далее процитирую Брюса Эккеля из Thinking in Java:

Код: java
1.
2.
3.
4.
* Память, выделенная под новый объект, заполняется двоичными нулями.
* Конструкторы базовых классов вызываются в описанном ранее порядке. В этот момент вызывается переопределенный метод superA() (да, перед вызовом конструктора класса А), где обнаруживается, что переменная а равна null из-за первого этапа.
* Вызываются инициализаторы членов класса в порядке их определения.
* Исполняется тело конструктора производного класса.



Но лучше сам прочитай первоисточник Поведение полиморфных методов при вызове из конструкторов
...
Рейтинг: 0 / 0
16.04.2013, 11:40:40
    #38227267
miklouha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
статические поля в java
Паша01,
премного благодарен, теперь все разъяснилось.)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / статические поля в java / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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