2017-01-13 5 views
2

Я немного разбираюсь в блоках инициализации, которые используются в классах. Но я наткнулся на этот вопрос:Блок инициализатора внутри основного метода?

//What is the output of the following program? 

public class Test { 
    private static int i = 0; 
    private static int j = 0; 
    public static void main(String[] args) { 
     int i = 2; 
     int k = 3; 

     // What is this thing, that appears to be like an initializer block inside the main method? 
     { 
      int j = 3; 
      System.out.println("i + j is " + i + j); 
     } 

     k = i + j; 

     System.out.println("k is " + k); 
     System.out.println("j is " + j); 
    } 
} 

Мой вопрос: Что это такое, что, как представляется, как инициализатор блок внутри основного метода?

+1

Используется для определения области действия. Переменные, объявленные внутри блока, будут неизвестны вне блока. Поэтому j нельзя использовать вне блока. – alexbt

+1

его просто блок и 'int j = 3;' является локальным для него, этот 'j = 3' недоступен вне, который показан значением' k.' –

+0

Блок локализует область действия переменной j '. Внутри блока 'j' относится к переменной, объявленной' int j = 3; '. Вне блока 'j' ссылается на статическое поле, объявленное' int j = 0; '. Помимо локализации переменных, фигурные скобки здесь не имеют никакого эффекта. – khelwood

ответ

3

Подводя итог комментариям для других, которые наткнулись на этот вопрос: {} - это блок, который определяет область действия. В этом конкретном примере значение j внутри блока будет равно 3. Однако вне блока будет ноль. Это приведет к различным результатам добавлений.

отметить также, что это утверждение System.out.println("i + j is " + i + j); бы просто напечатать

"I + J является 23"

и не

"I + J 5"

Это потому, что + оператор просто преобразует все int в их строковое представление и добавит их. Если вы хотите иметь сумму это заявление должно быть на самом деле: System.out.println("i + j is " + (i + j));

2

[Этот ответ адресован широкой начинающему аудитории]

В рамках метода, набор деклараций и заявлений, приложенном { } брекет является составной оператор, также называется оператор блока или просто блок. Он создает новую область, вложенную в текущую область видимости внутри тела метода.

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

if (a > b) 
{     // Block 
    int tmp = a; // 'tmp' is local to this block 
    a = b; 
    b = tmp; 
} 

Синтаксис блока может показаться необычным, однако, когда используется сам по себе без контрольного заявления:

// Bare block with no controlling if/else/for/while/do/switch 
{ 
    int t = frob(b); 
    b = frob(a); 
    a = flub(t, a); 
} 

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

Этот синтаксис может быть чрезмерно используется, конечно:

void froodle(int a, int b) 
{{ 
    if (a < 0 || a < b) 
    {{ 
     frob(-a, b); 
     frob(b, 0); 
    }} 
}} 

Хотя {{ }} двойные фигурные скобки выглядят необычно, они просто определить блок вложен в другой блок. В приведенном выше коде весь тело метода содержит один оператор, который сам является блоком.Для наглядности это можно переписать в виде:

void froodle(int a, int b) 
{ 
    { 
     if (a < 0 || a < b) 
     { 
      { 
       frob(-a, b); 
       frob(b, 0); 
      } 
     } 
    } 
} 

Блок синтаксис представляет собой особый случай, когда он появляется в определении класса, но не в теле метода. В этих случаях это инициализатор класса , т. Е. Блок кода, который выполняется, когда класс загружается и инициализируется первым. Это как если бы блок был телом специальной неназванной функции, которая запускается во время загрузки класса.

class Bar 
{ 
    static Foo myFoo; 

    // Class initializer 
    static 
    { 
     myFoo = new Foo(100); 
     myFoo.freeble(200); 
    } 

    ... 
} 

Добавление

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

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