龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

关于 final 的奇怪问题

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
[问题] 我们知道: 在Java 中,若内部类需要引用外部类的变量,则外部类的变量必须定义为final类型的.但在编码中,偶 尔发现在方法中的匿名内部类里就是可以访问外部类的非 final 变量,并

[问题]
  
我们知道: 在Java 中,若内部类需要引用外部类的变量,则外部类的变量必须定义为final类型的.但在编码中,偶
   尔发现在方法中的匿名内部类里就是可以访问外部类的非 final 变量,并且改变其值.

[代码分析]
   让我们看看代码,代码中注重外部类CounterTimer 中的非final类型 int  times,可以在CounterTimer类的方
   法 toStart()中,直接引用并改变其值.

代码功能:间隔2秒输出一个累次减小的数字,待到数字减为0,程序退出。
  
   import java.util.Timer;
   import java.util.TimerTask;

public class CounterTimer {
       //减少次数
       private int times;
       private Timer timer;
       public CounterTimer(int times) {
            this.times = times;
            timer = new Timer();
      }

   public void toStart() {
           //匿名内部类
          timer.schedule(new TimerTask(){
            public void run() {
               if(times > 0)
                 System.out.println(times — );
               else
                  toStop();
            }
         },0,2000);
      }

   public void toStop() {
          timer.cancel();
      }

    public static void main(String args[]){
            CounterTimer ct = new CounterTimer(5);
            ct.toStart();
        }
   }
  
   请再看一例:
   定义了方法huhu()
   public class TestFinal {
       //注重不是static final int var
       static int var = 10;
       public static void huhu() {
          (new A() {
              public void toPrint() {
                   System.out.println( Integer.toString(++var));
              }
           }).toPrint();
        }

   public static void main(String[] args) {
          huhu();
      }
   }

class A {
       public void toPrint() {
       }
   }
   输出结果:11
  
   [结论]
   呵呵,写到这里 可以有个小结了:在外部类的方法中创建的匿名内部类,可以引用外部类的非final 变量,并修改:)
  
   [其他]
   至于,是不是非得是匿名内部类才可以引用或者,对非primitive 类型的数据可否引用,没有深究.


  
精彩图集

赞助商链接