WEB开发网
开发学院WEB开发Jsp 关于 final 的奇怪问题 阅读

关于 final 的奇怪问题

 2008-01-05 18:33:02 来源:WEB开发网   
核心提示:[问题]我们知道: 在java 中,若内部类需要引用外部类的变量,则外部类的变量必须定义为final类型的.但在编码中,偶尔发现在方法中的匿名内部类里就是可以访问外部类的非 final 变量,并且改变其值. [代码分析]让我们看看代码,关于 final 的奇怪问题,代码中注重外部类CounterTimer 中的非fin

[问题]
我们知道: 在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 类型的数据可否引用,没有深究.


Tags:关于 final 奇怪

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接