黑马程序员技术交流社区

标题: 关于final的用法,内部类不能访问在另外一个方法中的非终态 [打印本页]

作者: silence    时间: 2012-3-8 23:36
标题: 关于final的用法,内部类不能访问在另外一个方法中的非终态
package threads;

public class MultiThreadShareData {

        public static void main(String[] args) {
               
                MultiThreadShareData x = new MultiThreadShareData();
               
                SharingData data = x.new SharingData();
               
                final Thread1 thread1 = x.new Thread1(data);//此两句中如果没有final,编译会有错误,为什么???
                final Thread2 thread2 = x.new Thread2(data);//此两句中如果没有final,编译会有错误,为什么???
               
                for(int i = 0; i < 2; i++){
                        new Thread(new Runnable(){
                                @Override
                                public void run() {
                                       
                                        while(true){
                                                thread1.decrease();//错误会出现与此,请注意
                                        }
                                }
                        }).start();
                       
                       
                        new Thread(new Runnable(){
                                @Override
                                public void run() {
                                       
                                        while(true){
                                                thread2.increase();////错误会出现与此,请注意
                                        }
                                }
                        }).start();
                }

        }

        class Thread1{
                private SharingData data;
                public Thread1(SharingData data){
                       
                        this.data = data;
                       
                }
                public void decrease(){
                        data.decrease();
                }

        }
       
        class Thread2{
                private SharingData data;
                public Thread2(SharingData data){
                       
                        this.data = data;
                       
                }
                public void increase(){
                       
                        data.increase();
                       
                }
        }
       
        class SharingData{
                private int data = 100;
                public synchronized void increase(){
                        data++;
                       
                        System.out.println(Thread.currentThread().getName() + " is increasing the data " + data);
                }
               
                public synchronized void decrease(){
                        data--;
                       
                        System.out.println(Thread.currentThread().getName() + " is decreasing the data " + data);
                }
        }

}

作者: 刘基军    时间: 2012-3-9 00:15
规定:局部内部类访问局部变量时,必须将局部变量进行final关键字修饰。
作者: a504079589    时间: 2012-3-9 00:54
在方法中的内部类中访问方法中的局部变量时,这个变量必须是final的;
因为,局部变量在方法运行结束之后生命周期就结束了,而内部类对象的生命周期还有可能没结束,为了能够访问到这个变量,就需要加上finla;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2