Значения по умолчанию и инициализация в Java



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



public class Main {
public static void main(String[] args) {
int a;
System.out.println(a);
}
}


строку System.out.println(a); будет ошибка, указывающая на переменную a что говорит variable a might not have been initialized, тогда как в данной ссылке, integer будет 0 как значение по умолчанию. Однако, с данным кодом ниже, он будет фактически печатать 0.



public class Main {
static int a;
public static void main(String[] args) {
System.out.println(a);
}
}


что может пойти не так с первым кодом? Делает класс экземпляр переменная ведет себя иначе, чем локальные переменные?

2965   8  

8 ответов:

В первом примере кода a Это main метод локальной переменной. Метод локальные переменные должны быть инициализированы перед их использованием.

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

Читайте более внимательно ваш ссылка:

Значения По Умолчанию

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

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

. . .

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

Это основные факторы, связанные:

  1. переменная-член (по умолчанию OK)
  2. статическая переменная (по умолчанию OK)
  3. конечная переменная-член (не инициализирована, должна быть установлена в конструкторе)
  4. конечная статическая переменная (не инициализирована, должна быть установлена на статическом блоке {})
  5. локальная переменная (не инициализирован)

Примечание 1: Вы должны инициализировать конечные переменные-члены на каждом реализованном конструкторе!

Примечание. 2: вы должны инициализировать конечные переменные-члены внутри блока самого конструктора, не вызывая другой метод, который их инициализирует. Например, это недопустимо:

private final int memberVar;

public Foo() {
    //invalid initialization of a final member
    init();
}

private void init() {
    memberVar = 10;
}

Примечание 3: массивы являются объектами в Java, даже если они хранят примитивы.

примечание 4: при инициализации массива все его элементы устанавливаются по умолчанию, независимо от того, является ли он членом или локальным массивом.

Я прилагаю пример кода, представляя вышеупомянутый случаи:

public class Foo {
    //static and member variables are initialized to default values

    //primitives
    private int a; //default 0
    private static int b; //default 0

    //objects
    private Object c; //default NULL
    private static Object d; //default NULL

    //arrays (Note: they are objects too, even if they store primitives)
    private int[] e; //default NULL
    private static int[] f; //default NULL

    //what if declared as final?

    //primitives
    private final int g; //not initialized, MUST set in constructor
    private final static int h; //not initialized, MUST set in a static {}

    //objects
    private final Object i; //not initialized, MUST set in constructor
    private final static Object j; //not initialized, MUST set in a static {}

    //arrays
    private final int[] k; //not initialized, MUST set in constructor
    private final static int[] l; //not initialized, MUST set in a static {}

    //initialize final statics
    static {
        h = 5;
        j = new Object();
        l = new int[5]; //elements of l are initialized to 0
    }

    //initialize final member variables
    public Foo() {
        g = 10;
        i = new Object();
        k = new int[10]; //elements of k are initialized to 0
    }

    //A second example constructor
    //you have to initialize final member variables to every constructor!
    public Foo(boolean aBoolean) {
        g = 15;
        i = new Object();
        k = new int[15]; //elements of k are initialized to 0
    }

    public static void main(String[] args) {
        //local variables are not initialized
        int m; //not initialized
        Object n; //not initialized
        int[] o; //not initialized

        //we must initialize them before usage
        m = 20;
        n = new Object();
        o = new int[20]; //elements of o are initialized to 0
    }
}

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

они:

  1. значения, объявленные внутри метода не будут присвоены значения по умолчанию.
  2. значения, объявленные как экземплярная переменная или статическая переменная, будут иметь значения по умолчанию, которые равны 0.

Итак, в вашем коде:

public class Main {
    int instanceVariable;
    static int staticVariable;
    public static void main(String[] args) {
        Main mainInstance = new Main() 
        int localVariable;
        int localVariableTwo = 2;
        System.out.println(mainInstance.instanceVariable);
        System.out.println(staticVariable);
       // System.out.println(localVariable); //will throw compilation error
        System.out.println(localVariableTwo);

    }
}

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

public class Main {
      int instaceVariable; // Instance variable will be initalized to default value
    public static void main(String[] args) {
        int localVariable = 0; // Local Variable Need to initalize before use
    }
}

локальные переменные не получают значения по умолчанию. Их начальные значения не определены без присвоения значений каким-либо образом. Перед использованием локальных переменных они должны быть инициализированы.

существует большая разница, когда вы объявляете переменную на уровне класса (как член ie. как поле) и на уровне метода.

Если вы объявляете поле на уровне класса, они получают значения по умолчанию в соответствии с их типом. Если вы объявляете переменную на уровне метода или как блок (означает anycode внутри {}) не получают никаких значений и остаются неопределенными до тех пор, пока они не получат некоторые начальные значения, т. е. некоторые значения, присвоенные им.

все переменные-члены должны загружаться в кучу, поэтому они должны инициализироваться значениями по умолчанию при создании экземпляра класса. В случае локальных переменных они не загружаются в кучу, они хранятся в стеке, пока они не будут использоваться до java 7, поэтому нам нужно явно инициализировать их.

в java инициализация по умолчанию применима только для переменной экземпляра члена класса это не применимо для локальных переменных.

Comments

    Ничего не найдено.