Java, определяющая или инициализирующая атрибуты класса

Java noob здесь. При кодировании нового класса при определении атрибутов класса существует разница в определении переменной и инициализации переменной. Есть ли случаи, когда вы хотели бы сделать один за другим? Я использовал примитив и объект по назначению, если есть разница для обоих случаев.

то есть.

import Java.util.Random;

public class Something extends Activity {
    int integer;
    Random random = null;

    Something(){
        integer = 0;
        random = new Random();
        ....

против.   импортировать Java.util.Random;

public class Something extends Activity {
    int integer = null;
    Random random;

    Something(){
        integer = 0;
        random = new Random();
        ....

Ответы

Ответ 1

Во-первых, вы не можете установить примитив как null как примитив, это просто данные, где null - ссылка на объект. Если вы попытались скомпилировать int i = null, вы получите ошибку несовместимых типов.

Во-вторых, инициализация переменных до null или 0 при объявлении их в классе избыточна, как в Java, для примитивов по умолчанию используется значение 0 (или false) и ссылки на объекты по умолчанию равны null. Это не относится к локальным переменным, однако, если вы попытались использовать ниже, вы получите ошибку инициализации во время компиляции

 public static void main(String[] args)
 {
     int i;
     System.out.print(i);
 }

Явно инициализировать их значением по умолчанию 0 или false или null бессмысленно, но вы можете установить их на другое значение по умолчанию, тогда вы можете создать конструктор со значениями по умолчанию, например

public MyClass
{
   int theDate = 9;
   String day = "Tuesday";

   // This would return the default values of the class
   public MyClass()
   {
   }

   // Where as this would return the new String
   public MyClass (String aDiffDay)
   {
      day = aDiffDay;
   }
}

Ответ 2

Шанку и Морфеус правильно ответили на вопрос. Во-первых, вы получите ошибку компиляции, при которой ваша примитивная переменная int "integer" будет равна null; вы можете сделать это только для объектов. Во-вторых, Шанку прав, что Java присваивает значения по умолчанию переменным экземпляра, которые являются "целыми" и "случайными" в вашем примере кода; переменные экземпляра можно просматривать внутри класса или за его пределами в зависимости от области действия (открытый, закрытый, защищенный, пакет).

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

Я бы порекомендовал читать документацию по переменной Java, которая очень хорошо описывает переменные и, кроме того, вы можете также просмотреть Java-учебники, которые также являются отличным материалом для чтения.

Ответ 3

В Java инициализация явно определена в спецификации языка. Для полей и компонентов массива, когда элементы создаются, они автоматически устанавливаются системой по умолчанию:

числа: 0 или 0.0

booleans: false

ссылки на объекты: null

Это означает, что явно задание полей в 0, false или null (в зависимости от случая) не является необходимым и избыточным.