public class Test{
enum Color{
RED,GREEN,BLUE;
}
}
//執行輸出結果
public static void main(String[] args){
Color c1=Color.RED;
System.out.println(c1);
}
//輸出的結果是RED
//為啥輸出的是RED,不應該是RED的地址值么?
uj5u.com熱心網友回復:
1. 所有列舉 都是繼承自 Enum 類2. Enum 重寫了 toString方法
public String toString() {
return name;
}
uj5u.com熱心網友回復:
因為列舉型別最終生成class檔案反編譯之后的代碼是這樣的public final class Color extends Enum
{
public static Color[] values()
{
return (Color[])$VALUES.clone();
}
public static Color valueOf(String name)
{
return (Color)Enum.valueOf(Color, name);
}
private Color(String s, int i)
{
super(s, i);
}
public static final Color RED;
public static final Color GREEN;
public static final Color BLUE;
private static final Color $VALUES[];
static
{
RED = new Color("RED", 0);
GREEN = new Color("GREEN", 1);
BLUE = new Color("BLUE", 2);
$VALUES = (new Color[] {
RED, GREEN, BLUE
});
}
}
而列舉類默認的toString方法是這樣的
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//省略其他代碼
public String toString() {
return name;
}
}
而這個name就是私有構造方法
private Color(String s, int i)
{
super(s, i);
}中的s
所以,總結如下:每個列舉類最終反編譯后都是繼承了enum類,同時多了私有構造方法
private Color(String s, int i)
{
super(s, i);
}和屬性name,而最終通過控制臺輸出的就是這個name,也就是列舉類里定義的每一個列舉值
uj5u.com熱心網友回復:
那c1又沒有呼叫toString()方法!!!
uj5u.com熱心網友回復:
感謝大哥評論,但我感覺現在理解不了,等我理解咯再來看看吧

uj5u.com熱心網友回復:
去看下 System.out.println(Object x)原始碼,里面呼叫了Object.toString()方法的
//這是 System.out.println(Object x)方法
public void println(Object x) {
//下面會貼出String.valueOf(x)方法的原始碼
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
//這是String.valueOf(Object obj)方法,呼叫了obj的toString()方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284709.html
標籤:Java相關
上一篇:redis的sds
下一篇:java注意事項
