为什么在for循环中定义新对象不是重新定义中的错误

时间:2015-06-29 05:22:22

标签: java

for(int i=1; i<=6; i++){
    List<Integer> a = new ArrayList<Integer>();
}

这是我的java代码,非常简单,但如果在for循环之外,如果我定义了两次,它将报告错误。但为什么在一个循环中它不会?

5 个答案:

答案 0 :(得分:0)

差异在于范围

在第一种情况下<script type="text/javascript" async="" src="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script> <link rel="stylesheet" type="text/css" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <button class='searhBtn'> PRESS </button> <div class="modal fade" id="modalSeach" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" > <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h3> Conformation </h3> </div> <div class="modal-body"> <p> Do you want to ? </p> </div> <div class="modal-footer"> <button class="btn btn-danger btn-xs" type="button" data-dismiss="modal">Close</button> <button class="btn btn-primary btn-xs" type="submit" name="permissions_submit" id="proceed" autofocus="autofocus" >Proceed</button> <!--id="permissions_submit"--> </div> </div> </div> </div> <script> $('.searhBtn').click(function(e) { $('#modalSeach').modal('show'); }); </script> 被引用到List<Integer> a的末尾,因此如果我们在同一范围内有两个相同名称的变量,编译器将进行编译。

对于第二种情况,每次循环执行时,不再引用最后一次迭代的main method,因此我们可以再次声明。

答案 1 :(得分:0)

在一个循环中,声明的变量只有循环,一旦循环迭代先前声明的变量不再存在。但是,一旦你离开循环就不是这种情况,因此错误

答案 2 :(得分:0)

如果当前变量范围中存在变量,则无法声明变量。

在您的情况下,每次迭代结束时都会被取消引用:

for (int i=1; i<=6; i++)
{
   List<Integer> a = new ArrayList<Integer>(); // variable a is declared

   // ...

   // end of iteration. variable a is unreferenced
}

这是另一个变量范围。 就像你有一个功能一样 这不是宣告。 这么糟糕的解释。我希望我不会再混淆你

public void Func()
{
   List<Integer> a = new ArrayList<Integer>(); 
   // do something
}

for (int i=1; i<=6; i++)
{
    Func();
}

答案 3 :(得分:0)

循环
List<Integer> ai++会被销毁。

循环外


List<Integer> ai++不会被销毁。

答案 4 :(得分:0)

您不能声明两个具有相同名称的变量(尽管它们具有不同的类型)存在于同一范围内。考虑一下,如果有可能,那么java编译器将如何确定你的意思:

differ

现在在 /* read a line from each file */ for (;;) { char *p1 = fgets (s1, MAXL, f1); /* check return of read */ char *p2 = fgets (s2, MAXL, f2); if ((!p1 && p2) || (p1 && !p2)) { differ = 1; /* if one file is longer than the other */ break; } else if (!(p1 || p2)) break; /* if both return NULL at EOF, break */ for (i = 0; i < skipsz; i++) /* skip if matches skip[i] */ if (strncmp (s1, skip[i], strlen (skip[i])) == 0 || strncmp (s2, skip[i], strlen (skip[i])) == 0 ) { if (strlen (s1) == strlen (s2)) goto skipping; /* yes -- it lives.... */ else { differ = 1; goto finish; } } if (strcmp (s1, s2)) { /* compare lines & set flag */ differ = 1; break; } skipping:; } finish:; 循环编译器中只会看到一个变量List<Integer> a = new ArrayList<Integer>(); List<Integer> a = new ArrayList<Integer>(); //Error: Duplicate variable a a.clear() // cannot determine which 'a' you meant 被声明,对他来说没问题!所以没有编译器错误。

但是当循环迭代时,每次创建for并且前一个a变成垃圾。我们很幸运,因为JAVA有垃圾收集器,它收集 orphan List a的垃圾。

不要a本地变量List a进入new循环,它只不过是内存泄漏。