• Q:记学习枚举过程中的一个小问题


    在学习有关java枚举的时候,我们知道了所有的枚举类型均是继承自java.lang.Enum类的,且所有的枚举常量均是该枚举类型的一个对象,且对象名即为该枚举常量的名称。
    例子如下:
    源码:

    public enum T {
        SPRING,SUMMER,AUTUMN,WINTER;
    }


    反编译后的代码:

    public final class T extends Enum
    {
        private T(String s, int i)
        {
            super(s, i);
        }
        public static T[] values()
        {
            return (T[])$VALUES.clone();
        }
     
        public static T valueOf(String s)
        {
            return (T)Enum.valueOf(T, s);
        }
     
        public static final T SPRING;
        public static final T SUMMER;
        public static final T AUTUMN;
        public static final T WINTER;
        private static final T $VALUES[];
        static
        {
            SPRING = new T("SPRING", 0);
            SUMMER = new T("SUMMER", 1);
            AUTUMN = new T("AUTUMN", 2);
            WINTER = new T("WINTER", 3);
            $VALUES = (new T[] {
                SPRING, SUMMER, AUTUMN, WINTER
            });
        }
    }

    在写代码的时候,由于输入法切换的问题,发现枚举常量的常量名称居然是可以使用中文的。
    代码如下:

    public enum Spring
    {
        春天;
    }
    class Test
    {
        public static void main(String[] args)
        {
            System.out.println(Spring.春天);
        }
    }

    其编译器并没有报错,且顺利的通过了编译。

    对以上枚举类的代码进行反编译,得到如下的结果。

     

    发现,其对象名为中文。而在java的命名规范中,只允许用美元符号$,英文字母,数字,下划线作为命名的元素。那么如今反编译的结果中出现了中文的情况,这是什么回事呢?
    经过分析和查找相关资料,发现,java其实是支持中文类名、方法名、属性名,并且不会因为乱码问题导致运行期链接失败。这是Java内核支持UTF-8这一特性决定的。但是Java语言规范里并不支持这一用法。所以,如下的代码运行起来是完全没有问题的。

     package other.jdk1_5;
    
    /**
     * 一个骚操作,使用中文对变量和方法进行命名
     * 
     * @author 学徒
     * 
     */
    public class 人
    {
        private String 名字;
        private int 年龄;
    
        public String get名字()
        {
            return 名字;
        }
    
        public void set名字(String 名字)
        {
            this.名字 = 名字;
        }
    
        public int get年龄()
        {
            return 年龄;
        }
    
        public void set年龄(int 年龄)
        {
            this.年龄 = 年龄;
        }
    
        public static void main(String[] args)
        {
            人 小明 = new 人();
            小明.set名字("小明");
            System.out.println(小明.get名字());
        }
    }
    运行结果:
    小明
  • 相关阅读:
    如何书写bat文件?(转)
    Bogon
    recursive
    ssh
    verbose
    mii-tool
    ExtJs 中的ext.date
    一个打包机~~~
    图标库--宝藏
    几种常用的控件(下拉框 可选框 起止日期 在HTML页面直接读取当前时间)
  • 原文地址:https://www.cnblogs.com/MyStringIsNotNull/p/8018428.html
Copyright © 2020-2023  润新知