Переменная экземпляра Java объявляет и инициализирует в двух инструкциях - PullRequest
1 голос
/ 12 сентября 2010

Привет, у меня проблема с инициализацией в Java, следующий код дает мне ошибку компиляции под названием: ожидаемый instanceInt = 100;но я уже это заявил.Если эти вещи связаны со стеком и кучей, объясните, пожалуйста, простыми терминами, и я новичок в Java, и у меня нет глубоких знаний в этой области

Ответы [ 5 ]

8 голосов
/ 12 сентября 2010

Вы не можете использовать утверждения в середине вашего класса. Он должен быть либо в блоке, либо в той же строке, что и ваше объявление.


Обычные способы сделать то, что вы хотите, это:

  • Инициализация при объявлении

    public class MyClass{
        private int i = 0;
    }
    

    Обычно хорошей идеей является определение значения по умолчанию для вашего поля.

  • Инициализация в блоке конструктора

    public class MyClass{
        private int i;
        public MyClass(){
            this.i = 0;
        }
    }
    

    Этот блок можно использовать, если вы хотите иметь некоторую логику (если / циклы) во время инициализации вашего поля. Проблема в том, что либо ваши конструкторы будут вызывать друг друга, либо все они будут иметь в основном одинаковое содержимое.
    В твоем случае я думаю, что это лучший путь.

  • Инициализация в методическом блоке

    public class MyClass{
        private int i;
        public void setI(int i){
            this.i = i;
        }
    }
    

    Это на самом деле не инициализация, но вы можете установить свое значение в любое время.

  • Инициализация в блоке инициализатора экземпляра

    public class MyClass{
        private int i;
        {
             i = 0;
        }
    }
    

    Этот способ используется, когда конструктора недостаточно (см. Комментарии к блоку конструктора), но обычно разработчики стараются избегать этой формы.


Ресурсы:

По той же теме:


Бонус:

Что означает этот код?

public class MyClass {
    public MyClass() {
        System.out.println("1 - Constructor with no parameters");
    }

    {
        System.out.println("2 - Initializer block");
    }

    public MyClass(int i) {
        this();
        System.out.println("3 - Constructor with parameters");
    }

    static {
        System.out.println("4 - Static initalizer block");
    }

    public static void main(String... args) {
        System.out.println("5 - Main method");
        new MyClass(0);
    }
}

Ответ

3 голосов
/ 12 сентября 2010

Поместите его в блок инициализатора.

public class Init { 

  int instanceInt;  
  {
    instanceInt = 100;
  }

  public static void main(String[] args) {
    int localInt;
    int u = 9000;
  }   
}  

Или просто инициализировать при объявлении:

public class Init { 

  int instanceInt = 100;

  public static void main(String[] args) {
    int localInt;
    int u = 9000;
  }   
} 

Ссылка:

1 голос
/ 12 сентября 2010

Вам нужно сделать:

int instanceInt = 100;

Если бы это было static, вы могли бы инициализировать в блоке static.

1 голос
/ 12 сентября 2010

Вы не можете иметь отдельный оператор для назначения значений членам класса в области объявления.Вы должны сделать это с помощью функции, обычно это метод класса.

Для вашего случая рассмотрите возможность выполнения присваивания, как только вы объявите.

0 голосов
/ 12 сентября 2010

Согласно спецификации языка Java :

Тело класса может содержать объявления членов класса, то есть поля (§8.3), классы (§8.5), интерфейсы (§8.5) и методы (§8.4). Тело класса также может содержать экземпляр инициализаторы (§8.6), статические инициализаторы (§8.7) и объявления конструкторов (§8.8) для класса.

Однако утверждение

instanceInt = 100;

не является ни одной из этих вещей, поэтому он не допускается как часть тела класса. Что вам нужно сделать, это:

int instanceInt = 100;

Это разрешено, поскольку это объявление поля , которое включает инициализатор переменной .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...