2014-10-23 2 views
2

Этот код не работает:Как возможно, что переменная может быть повторно объявлена ​​в цикле?

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int i=3; 
     int i=4; 
     System.out.println(i); 
    } 
} 

Тогда почему этот код работает?

public class Test 
{ 
    public static void main(String[] args) 
    { 
     for(int a=0;a<9;a++) 
     { 
      int b=a+1; 
      System.out.println(b); 
     } 
    } 
} 

Разве мы вновь объявить b снова и снова?

+0

Это потому, что сфера действия переменной, – User27854

+0

Когда вы перебираете цикл, существует уже иная с именем b. Итак, разве мы не объявляем другого? –

+0

Посмотрите на мой комментарий ниже, я дал вам подробное объяснение. – User27854

ответ

5

Каждая итерация цикла имеет свою собственную область видимости, поэтому объявления предыдущих итераций больше не находятся в области текущей итерации.

Это эквивалентно записи:

{ 
     int b=1; 
     System.out.println(b); 
    } 
    { 
     int b=2; 
     System.out.println(b); 
    } 
    { 
     int b=3; 
     System.out.println(b); 
    } 
    .... 
+0

@ TheLostMind думает о продолжительности жизни локальной переменной. – Rustam

1

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

В первом еи

int i=3; 
    int i=4; 

вы intialising i два раза, а это может быть

int i=3; 
i=4; 

поэтому значение I будет 4, помните INT I делает его переменной, и его значение может быть переопределено в его блоке объявления

1

В

public class Test { 
    public static void main(String[] args) { 
      int i=3; 
      int i=4; 
      System.out.println(i); 
    } 

Вы объявляете же имя переменной дважды. И В

 public class Test { 
     public static void main(String[] args) { 
      for(int a=0;a<9;a++) { 
      int b=a+1; 
      System.out.println(b); 
      } 
     } 
    } 

Здесь Ь локальная переменная внутри для цикла, и вы объявляете его в начале цикла. И внутри этого цикла нет повторяющегося имени.

1

Ваш первый пример будет работать с блоком

int i=3; 
{ 
    int i=4; 
    System.out.println(i); 
} 

Это создает новый «я», что тени первый «я» в лексической области видимости блока.

+1

Это работает, но я не думаю, что это ясно * объясняет * связанную с циклом часть вопроса OP. – ifloop

0

Это происходит из-за объема переменной,

Вариант 1:

public class Test 
{ 
public static void main(String[] args) 
{ 
    int i=3; 
    int i=4; 
    System.out.println(i); 
} 
} 

В здесь есть переменная я, определенный в том же объеме в два раза.

Случай 2:

public class Test 
{ 
public static void main(String[] args) 
{ 
    for(int a=0;a<9;a++) 
    { 
     int b=a+1; 
     System.out.println(b); 
    } 
} 
} 

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

Предлагаю вам перейти через область переменных в JAVA.

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


Update

public class Test1 { 
public static void main(String[] args) { 

    Person p1=new Person(); 
    System.out.println("Person Object p1 before for loop "+p1); 

    for(int i=0;i<5;i++){ 
     Person p2=new Person(); 
     System.out.println("Person object "+i+" "+p2); 
    } 

    System.out.println("Person Object p1 after for loop "+p1); 

} 
} 

пустышка класс Person

class Person{ } 

Выход

Person Object p1 before for loop [email protected] 
Person object 0 [email protected] 
Person object 1 [email protected] 
Person object 2 [email protected] 
Person object 3 [email protected] 
Person object 4 [email protected] 
Person Object p1 after for loop [email protected] 

Здесь я создал фиктивный класс под названием Люди и я объявил и инициировал Person объект внутри петля. Теперь, когда я распечатываю объект person, он выдает хэш-код.

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

+0

Спасибо! Я знаю, что эта практика не приветствуется. Я не знал, что переменная уничтожается, когда область действия заканчивается. Благодаря!!! –

+0

@DamanArora Добро пожаловать. – User27854

+0

Нет отходов ресурсов. Переменная выделяется один раз и повторно используется во время цикла. В общем, все локальные переменные создаются при вводе метода, и ничто, что вы можете сделать внутри метода, не может создавать новые переменные во время выполнения. Кроме того, эта практика на самом деле поощряется, вы должны всегда ограничивать область переменных до минимума. – Joni

0

Локальные переменные с областью цикла задаются в памяти, поскольку они инициализируются, и место памяти уничтожается, как только оно выходит из области видимости, так как предыдущая запись «b» b не может быть объявлена ​​еще раз . Но это не относится к переменной «a» с основной областью, потому что вы объявляете снова в главном, где уже есть запись переменной «a», поэтому вы не можете ее дублировать.

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