JAVA中枚举(为啥输出的是枚举值的名称而不是地址值)

骜沉 2021-05-21 05:56:36
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的地址值么?
...全文
500 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
=PNZ=BeijingL 2021-05-24
  • 打赏
  • 举报
回复
System.out.println(Object object)源码里使用的是对象的toString, 枚举重写了这个方法,
这个问题和之前有人问过Arraylist, List输出信息也是这个原因,重写了toString
骜沉 2021-05-22
  • 打赏
  • 举报
回复
引用 5 楼 大隐藏于寺的回复:
[quote=引用 3 楼 骜沉 的回复:][quote=引用 1 楼 sjlzcj的回复:]1. 所有枚举 都是继承自 Enum 类 2. Enum 重写了 toString方法
    public String toString() {
        return name;
    }
那c1又没有调用toString()方法!!![/quote] 去看下 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();
    }

[/quote] 好的哦谢谢,我看看
大隐藏于寺 2021-05-21
  • 打赏
  • 举报
回复
引用 3 楼 骜沉 的回复:
[quote=引用 1 楼 sjlzcj的回复:]1. 所有枚举 都是继承自 Enum 类 2. Enum 重写了 toString方法
    public String toString() {
        return name;
    }
那c1又没有调用toString()方法!!![/quote] 去看下 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();
    }

骜沉 2021-05-21
  • 打赏
  • 举报
回复
引用 2 楼 得一以生的回复:
因为枚举类型最终生成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,也就是枚举类里定义的每一个枚举值
感谢大哥评论,但我感觉现在理解不了,等我理解咯再来看看吧
骜沉 2021-05-21
  • 打赏
  • 举报
回复
引用 1 楼 sjlzcj的回复:
1. 所有枚举 都是继承自 Enum 类 2. Enum 重写了 toString方法
    public String toString() {
        return name;
    }
那c1又没有调用toString()方法!!!
得一以生 2021-05-21
  • 打赏
  • 举报
回复
因为枚举类型最终生成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,也就是枚举类里定义的每一个枚举值
sjlzcj 2021-05-21
  • 打赏
  • 举报
回复
1. 所有枚举 都是继承自 Enum 类 2. Enum 重写了 toString方法
    public String toString() {
        return name;
    }

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧