2015-03-28 2 views
1
class A { 
    int xyz = new B().show(); // prints c=0 and z=null 
    int c = -319; 
    B z = new B(); 
    int lmn = z.show(); // prints c=-319 

    class B { 
     int show() { 
      System.out.println("c=" + c); 
      System.out.println("z=" + z); 
      return -555; 
     } 
    } 
} 

class C { 
    public static void main(String args[]) { 
     A p = new A(); 
    } 
} 

Почему я получаю c=0 первоначально, а затем c=-319 позже. Аналогичным образом, почему z null изначально и после него не null. Что происходит в коде?Почему я получаю два разных выхода в Java коде

+4

Инициализация происходит в порядке, сверху вниз. Если вы избавитесь от класса 'A' ​​и вставьте логику в метод' a() ', должно быть очевидно, что происходит. –

+0

не должен это утверждение int xyz = new B(). Show() выдает ошибку «Незаконное обращение вперед», поскольку show() использует c, который еще не был выделен памятью? – paidedly

+0

Почему? Это еще один класс. Если бы вы могли ссылаться только на классы, объявленные по порядку, Java был бы очень странным языком ... –

ответ

3

Вы должны знать, что new оператор отвечает за создание пустого экземпляра класса (например, с полями, которые будут иметь значения по умолчанию: числовой: 0; булевы: false, символ: '\0' ссылка: null). Код конструктора вызывается после того, как new завершит свою работу и отвечает за правильное состояние для такого пустого объекта.

инициализации Теперь полей происходит в конструкторе, поэтому ваш код

class A { 
    int xyz = new B().show(); // prints c=0 and z=null 
    int c = -319; 
    B z = new B(); 
    int lmn = z.show(); // prints c=-319 

    class B { 
     int show() { 
      System.out.println("c=" + c); 
      System.out.println("z=" + z); 
      return -555; 
     } 
    } 
} 

является такой же, как (значения по умолчанию уведомления)

class A { 

    int xyz = 0; //default values 
    int c = 0;  // 
    B z = null;  // 
    int lmn = 0; // 

    A(){ 
     xyz = new B().show(); 
     c = -319; 
     z = new B(); 
     lmn = z.show(); 
    } 
    class B { 
     int show() { 
      System.out.println("c=" + c); 
      System.out.println("z=" + z); 
      return -555; 
     } 
    } 
} 

Также

xyz = new B().show(); 

такой же, как

xyz = this.new B().show(); 

Созданный экземпляр B будет иметь доступ к экземпляру A, который инициализируется в текущем конструкторе A. НО код, который инициализируется b и z

int c = -319; 
B z = new B(); 

происходят после первого show() метода (который использует b и z), что означает, что их значение по умолчанию будет показано.

Эта проблема не существует в случае второго show()

lmn = z.show(); 

, потому что теперь b и z инициализируются.

+0

Благодарю вас за сброс. Делает это так ясно. Ура! – paidedly

+0

@ user3678484 Добро пожаловать :) BTW Я добавил некоторые сведения, которые, возможно, сделают это еще более ясным. – Pshemo

0

В вашем line 2 Вы звоните int xyz = new B().show(); // prints c=0 and z=null в начале.

Который называет

class B { 
     int show() { 
      System.out.println("c=" + c); 
      System.out.println("z=" + z); 
      return -555; 
     } 
    } 

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

boolean      => false 
char      => \u0000 
int,short,byte/long  => 0/0L 
float /double    => 0.0f/0.0d 
any reference type   => null 

В вашем случае ìnt присвоенного 0 и ссылки на объект назначен null :)

Перемещайте line 2 код line 4 и он должен печатать, так как переменная инициализируется в настоящее время.

0

Класс создается с достаточной памятью, чтобы содержать все его поля.

Когда вы делаете:

A p = new A(); 

Это выделяет память для А и его полей (хуг, с, г и Lmn). Все они распределены в памяти со значениями по умолчанию (c is int so 0, z - объект, поэтому null [address is 0x00]).

При запуске:

int xyz = new B().show(); // prints c=0 and z=null 

Вы создаете новый экземпляр B. Когда что ссылки экземпляра с и г, он печатает их значения. В настоящее время они являются значениями по умолчанию. Во всех смыслах и целях перспективы show() заключается в том, что все поля, на которые он ссылается, были определены/объявлены или, по крайней мере, выделены.

Тогда при выполнении:

B z = new B(); 
int lmn = z.show(); // prints c=-319 

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

0

При создании объекта из А в классе С,

A p = new A(); 

По умолчанию конструкция получает класс и объект будет создаваться с переменными-членами класса со значениями по умолчанию. На это указывает значения переменных класса являются следующие:

  • хуг = 0 (потому что тип Int)
  • с = 0 (потому что это также Int)
  • г = нуль (поскольку оно ссылка)
  • LMN = 0 (так как, если тип INT)

см ниже скриншоте, чтобы увидеть состояние переменной

enter image description here

Когда она достигает ниже заявление для оценки А значения:

int xyz = new B().show() 

печатает значение с и г которого инициализация еще сделано таким образом, мы получим значение по умолчанию значения этих переменных как 0 и NULL соответственно ,

Когда второй раз, программа вызывает шоу() метод класс B. Все инициализации переменных были сделаны потому, что ниже инструкции выполняются до того времени, мы достигаем до z.show()

int c = -319; 
b z= new (B); // call the default constructor of B to create object 

см ниже экрана, чтобы увидеть состояния переменных.

enter image description here

так, он выводит значение C, как и -319 г в виде шестнадцатеричных значений объекта.(ноль)

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