[英]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;
r1和r2是Runnable
而不是Thread
在轉換時會生成ClassCastException
。
而是實例化Thread
並將runnable
實例傳遞給構造函數。
樣品
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.