《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

解决方案 »

  1.   


    成员变量和局部变量存储的地方不一样,非静态成员变量在堆上,局部变量在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()); 
       } 
      

  2.   


    他们是属于一个区的,我觉得这个代码等价与
     {
            int x = 12;
            {
                int x = 12;
            }
     }
    //等价于这个
    {
            int x = 12;
            int x = 12;   
     }
    //这个显然就不行了,变量名重复!
    //无论是在静态块,非静态,还是方法内部都不行的!
      

  3.   


      同意楼上mm的看法,java 里边的变量定义有使用周期。
      

  4.   

    public class Test{
       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》中说的那样。
      

  5.   

    你的程序跟别人的是不是同一个意思啊!
      int i=1; 
       public int fun1(){ 
           int i=2; 
           return i; 
       } 第一个i是全局变量,成语变量。第二个i是在fun内的局部变量。当fun1()生命周期结束了,哪么第二个i也结束了。
    不建议这种定义方法。
      

  6.   

    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()); 
       } 

      

  7.   

    这样说对不对?{ //--1
      int x=12; //这个x的生命周期是1这个括号里,
      { //--2
         int x=96; //这个的是2这个括号里,但是上面的那个x在着同样有效...
      } 
    }
      

  8.   

    java的全局变量(类)和局部变量(函数体内)
    和c/c++的所谓作用域好像概念上有点差别的吧,
    貌似java没有作用域这个概念的..
      

  9.   

    你的那个是成员变量和局部变量的关系
    和thinking in java中的那个不是一回事啊