for(int i=1; i<=6; i++){
List<Integer> a = new ArrayList<Integer>();
}
这是我的java代码,非常简单,但如果在for循环之外,如果我定义了两次,它将报告错误。但为什么在一个循环中它不会?
答案 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> a
时i++
会被销毁。
List<Integer> a
时i++
不会被销毁。
答案 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
循环,它只不过是内存泄漏。