展開全部
這樣做是不行的,原因是:Java中的對象實例化都是在堆中,如果是普通的類實例變量,比如在方法636f707962616964757a686964616f313333376166371中定義的普通類實例變量,傳到了方法2中,由于方法1和方法2中的實例變量對應著堆中的同一個對象實例,所以方法2中修改了對象實例的值,方法1中的值也會跟著變化。但是java中的枚舉不是這樣子的。比如下面的代碼:public?class?EnumClass?{
public?static?void?main(String?[]?args){
Color?color?=?Color.RED;
convert(color);
System.out.println(color.name());
}
public?static?void?convert(Color?c){
System.out.println(c.name());
c?=?Color.BLUE;
}
}
enum?Color{
RED,BLUE,GREEN;
}
如你問題中表述的,兩次輸出都是RED。具體原因,我們可以用javap反編譯一下這個類。得到下面的代碼Compiled?from?"EnumClass.java"
final?class?org.concurrency.art.Color?extends?java.lang.Enum?{
public?static?final?org.concurrency.art.Color?RED;
public?static?final?org.concurrency.art.Color?BLUE;
public?static?final?org.concurrency.art.Color?GREEN;
public?static?org.concurrency.art.Color[]?values();
public?static?org.concurrency.art.Color?valueOf(java.lang.String);
static?{};
}
可以看到枚舉其實也是用class實現的。而枚舉的值是這個類的static final型的常量。當EnumClass這個類加載后,虛擬機就會在堆區創建這三個實例化變量。這就可以回答為什么改變后無效了。main方法把color變量傳遞給convert方法的c時,兩者是指向堆區中的同一個地址,也就是Color.RED實例的地方,而后,變量c被重新賦值,此時變量c是指向了堆區中的Color.BLUE實例的位置。 這個賦值跟main方法中color變量是沒有一點關系的,main中的color變量還是指向的Color.RED實例的地方。 所以covert方法執行完后,main方法中的color變量是沒有變的。
如果想要它變化,我感覺有兩種方法,一種是covert方法返回一個想要的枚舉變量,在main中賦值給color,另一種方法是把這個變量再用一個類封裝一下,傳入到covert方法中。希望對你有幫助。