В Java, почему нужно инициализировать переменную int с 0, когда ей будет присвоено 0 только по умолчанию при объявлении? - PullRequest
9 голосов
/ 16 мая 2010

Какой цели он служит?

Просто прочитайте пример из книги, где автор сделал это.

int numOfGuesses=0;

Ответы [ 3 ]

19 голосов
/ 16 мая 2010

Автоматическое присвоение нулю применяется только к элементам, а не к локальным переменным. Если это локальная переменная и = 0 опущено, то эта переменная не имеет значения, даже ноль. Попытка использовать значение до того, как оно будет присвоено, приведет к ошибке компиляции. Например, этот код пытается использовать неинициализированную локальную переменную:

public class Program
{   
    public static void main(String[] args)
    {
        int numOfGuesses;   // local variable
        System.out.println(numOfGuesses);
    }
}

и выдает эту ошибку компиляции:

Program.java:6: variable numOfGuesses might not have been initialized
        System.out.println(numOfGuesses);

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

public class Program
{   
    int numOfGuesses; // member variable

    public void run()
    {
        System.out.println(numOfGuesses);
    }

    public static void main(String[] args)
    {
        new Program().run();
    }
}

Для членов я склонен присваивать нулевое объяснение, если в моем коде используется тот факт, что начальное значение равно нулю, и опускаю присвоение, если в моем коде не используется начальное значение (например, если это значение назначено конструктор или в другом месте). Результат одинаков в любом случае, так что это просто проблема стиля.

4 голосов
/ 16 мая 2010

Это более явно; некоторым нравится. Обратите внимание, что это относится только к полям - необходимо инициализировать локальные переменные; по умолчанию нет.

2 голосов
/ 16 мая 2010

Компиляция Java и время выполнения отличаются.

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

Это делается, когда класс используется впервые . Их порядок выполнения определяется их порядком в коде.

  • запуск статических блоков

    static{
    //do something here
    }
    
  • инициализация статических переменных

    public static int number;

Это будет обнулено 0;


Следующая группа инициализаций выполняется, когда создает объект . Их порядок выполнения определяется их порядком в коде.

  • запустить нестатический блок

    {
    // do something here 
    }
    
  • инициализировать нестатические (экземплярные) переменные

    public int instance_number;


И это когда и почему происходит инициализация по умолчанию! Это не верно для методов, потому что у них нет механизма, подобного классам. Таким образом, в основном это означает, что вам придется инициализировать EXPLICITLY каждой переменной метода. enter code here

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