java的这段enum代码看着好奇怪的感觉...

newsomeone 发布于 2019/07/05 13:53
阅读 590
收藏 1

解读下一代网络:算力网络正从理想照进现实!>>>

import java.text.DateFormat;
import java.util.Date;


public enum  ConstantSpecificMethod {

    DATE_TIME{
        @Override
        String getInfo(){
            return DateFormat.getDateInstance().format(new Date());
        }
    },
    CLASS_PATH{
        @Override
        String getInfo(){
            return System.getenv("CLASSPATH");
        }
    },
    VERSION{
        @Override
        String getInfo(){
            return System.getProperty("java.version");
        }
    };

    abstract String getInfo();

    public static void main(String[] args) {
        for (ConstantSpecificMethod csm : ConstantSpecificMethod.values()) {
            System.out.println(csm.getInfo());
        }
    }
}

enum中的属性为啥还能用方法,下面还放了个abstract方法..看不懂啥原理..看来基础知识还是不到家..............

加载中
1
tcxu
tcxu

enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

"可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。"

见:
java enum(枚举)使用详解 + 总结 - ido - 博客园

下列代码案例的文档:"Volk.java", 进一步演示上述说法。

interface Behaviour {
    void print();
    String getInfo();
}

public enum Volk implements Behaviour {
    CHINESE("李明", 1) {
    	void eating(){
    		System.out.println("用筷子吃饭");  		 
    		 	}
    		 }, 
    AMERICAN("特朗普", 2){
    		void	eating(){
    		System.out.println("用刀叉吃饭");
    				}
   			}, 
    INDIAN("甘地", 3){
    			void eating(){
    				System.out.println("用手抓吃饭");
    				}
    		}; 
    
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    private Volk(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // 接口方法

    @Override
    public String getInfo() {
        return this.name;
    }

    // 接口方法
    @Override
    public void print() {
        System.out.println(this.index + ":" + this.name);
        eating();
    }
    
    abstract void eating();
      
public static void main(String[] args) {
 
        for (Volk p : Volk.values()) {
           p.print();
        }
    }
}

DOS 窗口的输出:

D:\java\test\person>javac Volk.java

D:\java\test\person>java Volk
1:李明
用筷子吃饭
2:特朗普
用刀叉吃饭
3:甘地
用手抓吃饭

 


 

0
墨盒
墨盒
你可以反编译看一下,ENUM本质是类 不过这种写法真的很有意思,,应该是用来绕过枚举不允许继承的限制
0
Shazi199
Shazi199

没什么奇怪的,枚举类型本质也是个类,如果声明了抽象方法,就要在实例化的时候实现它,和匿名类实现接口是一个道理。

0
一剪梅i
一剪梅i
编译之后会多出几个匿名内部类的文件,jad反编译看下编译器干了啥就知道啦。
0
f
freezingsky

只要是类, 就可以有方法. Enum也是类, 为啥不可以?

tcxu
tcxu
Enum也是类, 可以有属性。例如楼上的案例: enum Volk, 其属性,即成员变量有: private String name 和 private int index。
tcxu
tcxu
由于 Enum 都是 Object 的子类,至少有一个方法 String toString() {...}
tcxu
tcxu
Enum也是类, 可以有方法。例如楼上的案例: enum Volk。将它(Volk)看成是一个类,Volk 有 4 个方法,即 一个构造方法 private Volk(String name, int index) {...}, 和 3 个重写/覆盖 的方法:void eating(){...},String getInfo(){...}, 和 void print(){...}。
返回顶部
顶部