2012-05-28 3 views
0

Использование Java Я пытаюсь инициализировать переменные-члены при объявлении, но по какой-то причине переменные остаются по умолчанию, например. 0, нуль и т.д.Элементы-члены не могут быть инициализированы при объявлении

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

public class B extends A { 

Map<Integer, Integer> map = new HashMap <Integer, Integer>(); 
int number = 10; 

public B() { 
    super(); 
} 

public Map getMap() { 
    return map; 
} 

public int getNumber() { 
    return number; 
} 

} 

Важной частью кода является то, что он является подклассом, и что я m пытается инициализировать две переменные-члены при объявлении. Когда я вхожу в конструктор, значения карты и числа равны нулю и 0 соответственно, в чем причина этого?

+2

Отрывки из ИМО должны быть вырезаны и вклеены, что явно не является тем, что затрудняет диагностику проблем, чем это необходимо. –

+0

У вас есть те же самые члены в вашем 'A'class? –

+0

Невозможно сказать в данный момент. Пожалуйста, предоставьте краткую, но * полную * программу, которая демонстрирует проблему. –

ответ

0

Моя догадка здесь что происходит:

class A { 
     protected Map<Integer,Integer> map; 
     protected int number; 

     public A() { 
      map=new Map() {{ //This is just initializing the map 
       put(1,1); 
      }} 
      number=5; 
     } 
    } 

    public class B extends A { 

     Map<Integer, Integer> map = new HashMap <Integer, Integer>(); 
     int number = 10; 

     public B() { 
      super(); 
     } 
    } 

Служащий, что происходит в конструкторе B, с точки зрения компилятора:

  1. Перейти к конструктору no-param для A.
  2. Mapmap.
  3. intnumber.
  4. Инициализировать map со значением 1 в ключевых 1.
  5. Initialize number до 5.
  6. Done здесь, перейдите к остальной части конструктора B «s.
  7. Mapmap. Это переопределит переменную, которая называется map, построенная в A.
  8. intnumber. Это переопределит переменную, которая называется number, построенная в A.
  9. (Не инициализировать map.)
  10. (Не инициализировать number.)
  11. Готово.

Надеюсь, это прояснит ситуацию. Если вы не хотите, чтобы это произошло, инициализируйте поля B в своем собственном конструкторе.

+0

Это не объяснило бы поведение OP, которое они утверждали, что «карта» была «null», а «number» - «0». –

+0

Как я уточнил в своих комментариях, переменные-члены в подклассе имели уникальные имена, которые не соответствовали чему-либо в суперклассе. Когда я проходил через программу, он переходил бы в конструктор и вызывал super(), не переходя к переменным-членам и сначала инициализируя их. Я не смог его воссоздать, но я подозреваю, что это была синтаксическая ошибка (скорее всего, слишком много или слишком мало брекетов, когда я прокомментировал большую часть класса, в котором я смог заставить его работать). – LDM91

Смежные вопросы