方法本地内部类的范围

时间:2014-08-04 18:06:11

标签: java multithreading inner-classes

我有以下代码:

class MyThread{
      static volatile java.io.PrintStream s=System.out;
      public static void main(String args[]){
        Runnable r1=new Runnable(){
          public void run(){
            synchronized(s){
              for(int i=0; i<100; i++)
                 system.out.println("in r1");
            }
          }
        };
        Runnable r2=new Runnable(){
          public void run(){
            synchronized(s){
              for(int i=0; i<100; i++)
                 system.out.println("in r2");
            }
          }
        };
        Thread t1=(Thread)r1;
        Thread t2=(Thread)r2;
        t1.start();
        t2.start();
      }
}

我的问题是:由于r1和r2是方法本地内部类,他们怎么能访问&#39;因为它不是最终的?代码不会给出任何错误。

但它会排除&#39; Thread t1=(Thread)r1; Thread t2=(Thread)r2;&#39;,为什么会这样?

提前致谢

2 个答案:

答案 0 :(得分:5)

通常,内部类可以访问其封闭实例的非最终成员。

他们无法访问在声明它们的范围内声明的非最终局部变量。

也就是说,您的匿名类是在静态方法中定义的,因此它们没有封闭的实例,但是它们正在访问静态类成员,因此它们也是有效的。

对于异常,您尝试将匿名实例强制转换为Thread,即使它们的类型不是Thread(其类型为Runnable)。

你要做的可能是:

    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);
    t1.start();
    t2.start();

答案 1 :(得分:5)

<强>问题:

Thread t1=(Thread)r1;
Thread t2=(Thread)r2;

r1 r2 Runnable而不是Thread,在投出后会生成ClassCastException

而是实例化Thread并将runnable实例传递给构造函数。

<强>样品

Thread t1=new Thread(r1);
Thread t2=new Thread(r2);