全篇
Enum的使用很方便,之前想写一篇一直拖到现在,话不多说直接上代码
先贴全篇,可以直接down下来跑,全篇后是详解
package com.example.demo.st.setEnum;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;/** * Personnel class * * @author TransientBa * @date 2018/2/28 */public enum Personnel { 慈祥的季节("男",21,86), sxdyf("女",22,55){ @Override public boolean isPass(){ return false; } }, xydjr("男",23,73); private String sex; private int age; private int result; /* 构造 */ private Personnel(String sex,int age,int result){ this.sex = sex; this.age = age; this.result = result; } @Override public String toString() { return this.name()+" 性别:"+this.getSex() + " 年龄:"+this.getAge()+" 成绩为:"+this.getResult(); } /** * 调出简介 * * @return */ public String callResume(){ Personnel personnel = this; switch (personnel){ case 慈祥的季节: System.out.println(this.name()+"的简介为:"); System.out.println(this.toString()); System.out.println("是否通过了考试: "+this.isPass()); break; case sxdyf: System.out.println(this.name()+"的简介为:"); System.out.println(this.toString()); System.out.println("是否通过了考试: "+this.isPass()); break; default: System.out.println(this.name()+"的简介为:"); System.out.println(this.toString()); System.out.println("是否通过了考试: "+this.isPass()); break; } System.out.println("--- --- --- --- --- --- ---"); return ""; } /** * 比较成绩 * @param otherPersonnel * @return */ public String compareResult(Personnel otherPersonnel){ int pr1 = this.getResult(); int pr2 = otherPersonnel.getResult(); String pn1 = this.name(); String pn2 = otherPersonnel.name(); return pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同"); } public String compareStudentNumber(Personnel personnel){ String pn1 = this.name(); String pn2 = personnel.name(); String tipStuNumber = ""; //compareTo返回负整数(小于) 零(登录) 正整数(大于) 由 pn1.ordinal - pn2.ordinal产生 if(this.compareTo(personnel) >0){ tipStuNumber = pn1+"的学号在"+pn2+"之后"; }else if(this.compareTo(personnel) < 0){ tipStuNumber = pn1+"的学号在"+pn2+"之前"; }else { tipStuNumber = "两个人的学号相同"; } return pn1+"的学号为:"+((int)this.ordinal()+1)+" "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber; } public static void main(String[] args) {// for(Personnel personnel:Personnel.values()){// System.out.println(personnel.name()+"的简介为:");// System.out.println(personnel.toString());// System.out.println("是否通过了考试:" + personnel.isPass());// System.out.println("----------------------");// } Personnel.慈祥的季节.callResume(); System.out.println(Personnel.sxdyf.compareResult(Personnel.慈祥的季节)); System.out.println(Personnel.慈祥的季节.compareStudentNumber(Personnel.xydjr)); } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isPass(){ return true; } public int getResult() { return result; } public void setResult(int result) { this.result = result; }} 定义 public enum Personnel { 慈祥的季节,sxdyf,xydjr;}//扩展一下public enum Personnel { 慈祥的季节("男",21,86), sxdyf("女",22,55), xydjr("男",23,73); private String sex; private int age; private int result;}//在扩展一下 重写sxdyf的isPass方法 重写下toString 并带上构造 getset不贴了public enum Personnel { 慈祥的季节("男",21,86), sxdyf("女",22,55){ @Override public boolean isPass(){ return false; } }, xydjr("男",23,73); private String sex; private int age; private int result; /* 构造 */ private Personnel(String sex,int age,int result){ this.sex = sex; this.age = age; this.result = result; } @Override public String toString() { return this.name()+" 性别:"+this.getSex() + " 年龄:"+this.getAge()+" 成绩为:"+this.getResult(); }} ordinal 与 compareTo
ordinal :
返回所在位置 例如 Personnel.慈祥的季节 .ordinal();
compareTo :
比较两个enum定义时的位置 返回值为this.ordinal - other.ordinal
public String compareStudentNumber(Personnel personnel){ String pn1 = this.name(); String pn2 = personnel.name(); String tipStuNumber = ""; //compareTo返回负整数(小于) 零(登录) 正整数(大于) 由 pn1.ordinal - pn2.ordinal产生 if(this.compareTo(personnel) >0){ tipStuNumber = pn1+"的学号在"+pn2+"之后"; }else if(this.compareTo(personnel) < 0){
便宜香港vps tipStuNumber = pn1+"的学号在"+pn2+"之前"; }else { tipStuNumber = "两个人的学号相同"; } return pn1+"的学号为:"+((int)this.ordinal()+1)+" "+pn2+"的学号为:"+((int)personnel.ordinal()+1)+"\n"+tipStuNumber; }
1.8中源码为
public final int compareTo(E o) { Enum<?> other = (Enum<?>)o; Enum<E> self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; } getDeclaringClass
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
以上面的代码为例
System.out.println(Personnel.慈祥的季节.getDeclaringClass());
返回值为
name 与 values
name返回当前定义的枚举名
values返回所有的枚举值
for(Personnel personnel:Personnel.values()){ System.out.println(personnel.name()+"的简介为:"); System.out.println(personnel.toString()); System.out.println("是否通过了考试:" + personnel.isPass()); System.out.println("----------------------"); }
结果为:
注意
说句题外话,注意全篇中的compareResult方法与compareStudentNumber方法,在compareResult返回的三元中,并不等同于compareStudentNumber中的if else 实际等同如下
pr1 > pr2 ? pn1+"比"+pn2+"高"+(pr1-pr2)+"分":(pr1 < pr2 ? pn1+"比"+pn2+"低"+(pr2-pr1)+"分":pn1+"与"+pn2+"成绩相同");等价于if(pr1 > pr2){ //....}else{ if(pr1 < pr2){ //... }else{ //... }}区别在于并不并列if(){ //...}else if(){ //...}else{ //...} 总结
enum也同其他一样可理解为一个类,不同的为enum不能使用extends继承其他类。
68198406