public class Demo1 {
public static void main(String[] args) {
int x = 100;
System.out.println("x="+x);
{
int x = 10; // 这个x报错 跟上面的变量名重名
System.out.println("x="+x);
}
}
}
//这样就不会报错 这个是为什么
public class Demo1 {
public static void main(String[] args) {
{
int x = 10;
System.out.println("x="+x);
}
int x = 100;
System.out.println("x="+x);
}
}
如果可以的话 麻烦把3中代码块跟我分析下 网上看的太官方了 理解不了 它到底有什么作用 在什么时候用
{
int x = 10;
System.out.println("x="+x);
}
上面这个叫做 局部代码块
作用是: 控制变量的生命周期
当我们已经使用完 x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了。
错误的例子中,x 定义在 main 方法头部,其作用范围是 从定义处一直到方法结束。
这种情况,再定义一个与其同名的变量就会出错。
正确的例子中,局部代码块中的x在跳出代码后已经被释放。在这之后再定义x是可以的。
这个x的作用范围也是 从定义处一直到方法结束
用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢。
代码块(一对大括号)就是一个作用域啊,第一种情况,在代码块中声明x的时候,main方法作用域>代码块作用域,这时候显然变量重复声明了。
第二种情况,代码从上到下执行,等到在main方法中声明x的时候,代码块中的代码已经执行完毕了,不会影main方法域中的x声明。
简而言之 第一个是先定义了一个全局变量int X 代码块引用时又申明x数据类型肯定报错
下面是 先在代码块里定义了一个局部变量 int x(作用范围就限定在代码快中) 外部又定义了int x 二者在栈区中的指向不同
第一个中,是在main方法定义一个int类型的变量x,并且赋值100,这个x的生命周期是在持续在整个main方法中的,可以在整个main方法类的任何地方被引用。然后你在main方法中的子方法中又新建一个x变量时,因为已经存在了相对于main方法的全局变量x,所以就会报错。第二个是在main方法中,你先建立一个临时变量x,然后子方法执行完后,x被回收销毁,然后在建一个x,这样当然不会报错。