(1)程序1:
package com.ibm;public class HuaWei3{ //引用传递
   
    
    public static void main(String[] args){
    
       Number n1 = new Number();
       Number n2 = new Number();
       n1.i=12;
       n2.i=47;
       System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
       n1 = n2;
       System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
       n1.i=27;
       System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
    }
    
    class Number{
       int i;
    }
}
/*
 程序会报错:HuaWei3.java:9: 无法从静态上下文中引用非静态 变量 this
              Number n1 = new Number();
                   ^
HuaWei3.java:10: 无法从静态上下文中引用非静态 变量 this
       Number n2 = new Number();
                   ^
*/
(2)程序2:
package com.ibm;public class HuaWei4{ //引用传递
   
    int i;
    public static void main(String[] args){
    
       HuaWei4 n1 = new HuaWei4();
       HuaWei4 n2 = new HuaWei4();
       n1.i=12;
       n2.i=47;
       System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
       n1 = n2;
       System.out.println("2: n1.i="+n1.i+", n2.i="+n2.i);
       n1.i=27;
       System.out.println("3: n1.i="+n1.i+", n2.i="+n2.i);
    }
}/*
  运行结果:1: n1.i=12, n2.i=47
   2: n1.i=47, n2.i=47
   3: n1.i=27, n2.i=27
*/
这两个程序有什么不一样的,程序2中不是也引用了非静态变量吗?可以解释一下是什么原因吗?在线等啊。

解决方案 »

  1.   


    public class HuaWei3{ //引用传递
        
        
      public static void main(String[] args){
      
      Number n1 = new Number();
      Number n2 = new Number();
      n1.i=12;
      n2.i=47;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      n1 = n2;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      n1.i=27;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      }
        
      static class Number{
      int i;
      }
    }
    这样就能编译通过,至于出现:
    HuaWei3.java:6: 无法从静态上下文中引用非静态 变量 this
      Number n1 = new Number();
                  ^
    HuaWei3.java:7: 无法从静态上下文中引用非静态 变量 this
      Number n2 = new Number();
                  ^此源文件编译后会生成两个class文件,一个是HuaWei3.class 另一个是HuaWei3$Number.class这个内部类的class文件
    当new Number()的时候,编译器可能认为HuaWei3$Number.class此时并没有被载入(Java中的类是动态加载的)
    所以会出现无法从静态的上下文中引用非静态变量这样的编译错误。而第二个程序编译后只生成一个class文件:HuaWei4.class。其实我也不知道答案,只是这么感觉的....
      

  2.   

    第一段代码Number类是Huawei3类的内部类,能在Huawei3类中使用,但不能在static方法中使用
      

  3.   


    你这里Number类定义成HuaWei3的内部类了,如果要new一个新的Number对象出来,必须你先new个HuaWei3对象出来
    或者你这样写这行package com.ibm;public class HuaWei3{ //引用传递
        
        
      public static void main(String[] args){
      
      Number n1 = new Number();
      Number n2 = new Number();
      n1.i=12;
      n2.i=47;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      n1 = n2;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      n1.i=27;
      System.out.println("1: n1.i="+n1.i+", n2.i="+n2.i);
      }
        
    }  class Number{
      int i; 
      }