簡體   English   中英

方法局部內部類的作用域

[英]method local inner classes scope

我有以下代碼:

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是方法局部內部類,因此它們如何訪問不是最終的's'? 代碼沒有給出任何錯誤。

但是它會在' Thread t1=(Thread)r1; Thread t2=(Thread)r2; Thread t1=(Thread)r1; Thread t2=(Thread)r2; ', 為什么這樣?

提前致謝

通常,內部類可以訪問其封閉實例的非最終成員。

他們無法訪問在其聲明范圍內聲明的非最終局部變量。

也就是說,您的匿名類是在靜態方法中定義的,因此它們沒有封閉的實例,但是它們正在訪問靜態類成員,因此這也是有效的。

至於異常,您正在嘗試將匿名實例轉換為Thread ,即使它們的類型不是Thread(其類型為Runnable )。

您正在嘗試做的可能是:

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

問題:

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

r1r2Runnable而不是Thread在轉換時會生成ClassCastException

而是實例化Thread並將runnable實例傳遞給構造函數。

樣品

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM