《Thinging in Java 》中文版第四版
2.3.1章中说:尽管以下代码在C和C++中式正确的,但在Java中却不能这么写:
{
int x=12;
{
int x=96;
}
}
编译器将会告诉变量x已经定义过。.....=====================================================
可是我下面这段程序运行一点问题也没有:
class Test{
int i=1;
public int fun1(){
int i=2;
return i;
}
public static void main(String[] args){
Test t=new Test();
System.out.println(t.i);
System.out.println(t.fun1());
}
}难道经典书籍中也有这么低级的错误?!还是只是建议不要这么些(可是编译器没搞任何警告啊更不用说错误了)
jdk1.5.06
2.3.1章中说:尽管以下代码在C和C++中式正确的,但在Java中却不能这么写:
{
int x=12;
{
int x=96;
}
}
编译器将会告诉变量x已经定义过。.....=====================================================
可是我下面这段程序运行一点问题也没有:
class Test{
int i=1;
public int fun1(){
int i=2;
return i;
}
public static void main(String[] args){
Test t=new Test();
System.out.println(t.i);
System.out.println(t.fun1());
}
}难道经典书籍中也有这么低级的错误?!还是只是建议不要这么些(可是编译器没搞任何警告啊更不用说错误了)
jdk1.5.06
成员变量和局部变量存储的地方不一样,非静态成员变量在堆上,局部变量在java栈上
class Test{
int i=1; //成员变量i
public int fun1(){
int i=2; //局部变量i,这个i的生命期间为这个方法的调用期!
return i;
}
public static void main(String[] args){
Test t=new Test();
System.out.println(t.i);
System.out.println(t.fun1());
}
}
他们是属于一个区的,我觉得这个代码等价与
{
int x = 12;
{
int x = 12;
}
}
//等价于这个
{
int x = 12;
int x = 12;
}
//这个显然就不行了,变量名重复!
//无论是在静态块,非静态,还是方法内部都不行的!
同意楼上mm的看法,java 里边的变量定义有使用周期。
public static void main(String[] args){
for(int i=0;i<3;i++)
System.out.println(i);
int i=10;
System.out.println(i);
}
}
===================================================================
这个程序能正常运行,
这不说明了Java和C++一样有作用域吗?
而不是《Thinking in Java》中说的那样。
int i=1;
public int fun1(){
int i=2;
return i;
} 第一个i是全局变量,成语变量。第二个i是在fun内的局部变量。当fun1()生命周期结束了,哪么第二个i也结束了。
不建议这种定义方法。
int i=1; //这个变量和下面那个不是一个变量,所以可以这写
public int fun1(){
int i=2;
return i;
}
public static void main(String[] args){
Test t=new Test();
System.out.println(t.i);
System.out.println(t.fun1());
}
}
int x=12; //这个x的生命周期是1这个括号里,
{ //--2
int x=96; //这个的是2这个括号里,但是上面的那个x在着同样有效...
}
}
和c/c++的所谓作用域好像概念上有点差别的吧,
貌似java没有作用域这个概念的..
和thinking in java中的那个不是一回事啊