
这样做是不行的,原因是:Java中的对象实例化都是在堆中,如果是普通的类实例变量,比如在方法1中定义的普通类实例变量,传到了方法2中,由于方法1和方法2中的实例变量对应着堆中的同一个对象实例,所以方法2中修改了对象实例的值,方法1中的值也会跟着变化。但是java中的枚举不是这样子的。比如下面的代码:
public class EnumClass {public static void main(String [] args){
Color color = ColorRED;
convert(color);
Systemoutprintln(colorname());
}
public static void convert(Color c){
Systemoutprintln(cname());
c = ColorBLUE;
}
}
enum Color{
RED,BLUE,GREEN;
}
如你问题中表述的,两次输出都是RED。具体原因,我们可以用javap反编译一下这个类。得到下面的代码
Compiled from "EnumClassjava"final class orgconcurrencyartColor extends javalangEnum<orgconcurrencyartColor> {
public static final orgconcurrencyartColor RED;
public static final orgconcurrencyartColor BLUE;
public static final orgconcurrencyartColor GREEN;
public static orgconcurrencyartColor[] values();
public static orgconcurrencyartColor valueOf(javalangString);
static {};
}
可以看到枚举其实也是用class实现的。而枚举的值是这个类的static final型的常量。当EnumClass这个类加载后,虚拟机就会在堆区创建这三个实例化变量。这就可以回答为什么改变后无效了。main方法把color变量传递给convert方法的c时,两者是指向堆区中的同一个地址,也就是ColorRED实例的地方,而后,变量c被重新赋值,此时变量c是指向了堆区中的ColorBLUE实例的位置。 这个赋值跟main方法中color变量是没有一点关系的,main中的color变量还是指向的ColorRED实例的地方。 所以covert方法执行完后,main方法中的color变量是没有变的。
如果想要它变化,我感觉有两种方法,一种是covert方法返回一个想要的枚举变量,在main中赋值给color,另一种方法是把这个变量再用一个类封装一下,传入到covert方法中。希望对你有帮助。
就是变量赋值和取值的问题。不用枚举,你自己的类里面申明一个String变量A。然后获取自己类对象后。或者在初始化类的时候设置A的值为:A=“xx-xx”;
在要使用的地方对象A就取到值了。
还不如javabean的set和get安全呢
java中可以私用enummap来保存枚举值,示例如下:
private static void testEnumMap() {// 1 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是key 的类的类型
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
Light class );
currEnumMapput(Light RED , " 红灯 " );
currEnumMapput(Light GREEN , " 绿灯 " );
currEnumMapput(Light YELLOW , " 黄灯 " );
// 2 遍历对象
for (Light aLight : Lightvalues ()) {
System out println( "[key=" + aLightname() + ",value="
+ currEnumMapget(aLight) + "]" );
}
}
定义一个简单的枚举代码
public enum WorkDay{ Monday,Tuesday,Wednesday,Thurday,Friday;//定义时,枚举值间有逗号隔开,最后用分号结束 }
废话不多说,直接上main 方法,拿去玩玩吧:
Java代码
public static void main(String []args) { / 枚举类型是一种类型,既然是类型,就是跟int,char他们 一样的, 拿来定义变量,限制你对变量的赋值,就像 int a,你不能够给a一个 string的值 同理,一个枚举用来定义一个变量时,你只能够赋枚举值,其方式为 "枚举名值" / WorkDay myworkday=WorkDayWednesday; / 补充点switch的基础知识,switch语句括号中支持byte \short \char \int类型, jdk 15以后支持枚举,所以,这里可以直接使用枚举变量myworkday。 呵呵,在jdk17后将switch将支持string / switch (myworkday) { /枚举重写了toString()方法,所以枚举变量的值不带前缀 myworkday 里面的值应该是枚举括号里面的那几个 / case Monday: Systemoutprintln("you work day is Monday !"); break; case Tuesday: Systemoutprintln("you work day is Tuesday!"); break; case Wednesday: Systemoutprintln("you work day is Wednesday !"); break; case Thurday: Systemoutprintln("you work day is Thurday !"); break; case Friday: Systemoutprintln("you work day is Friday !"); break; } Systemoutprintln("--------遍历所有值----------"); //----使用values()方法返回一个数组 for(WorkDay day:WorkDayvalues()) { Systemoutprintln(day); } //-----既然是数组,就可以统计大小 Systemoutprintln("WorkDay 里面有 "+WorkDayvalues()length+" 个元素"); //--------------------调用 ordinal()方法,返回枚举值在枚举中的索引,数组索引嘛,当然从0开始 Systemoutprintln(WorkDayMondayordinal()); Systemoutprintln(WorkDayFridayordinal()); //---默认实现javalangComparable接口 ,测试测试 Systemoutprintln(WorkDayMondaycompareTo(WorkDayThurday));//结果应该是 -3 //---Monday的索引为0,Thurday为 3,0-3=-3, Systemoutprintln(WorkDayFridaycompareTo(WorkDayTuesday));//同理,结果应该为4-1=3, }
简单吧,来点狠的,前面说了,枚举有点像类,只是把class换成了enum,那么它跟一般的类一样可以添加属性或方法。
带方法与属性的enum代码
public enum WeAreJavaer{ chinese,java, spring, DB2, AIX; // 枚举列表,必须写在最前面,否则编译出错 private final static String location = "javaeye"; //定义一个属性 public static WeAreJavaer getInfomation() { WeAreJavaer flag=null; if (locationequals("javaeye")) { flag=java; } else { flag= chinese; } return flag; } }
老规矩,直接上main()方法测试:
写道
public static void main(String []ags) { Systemoutprintln("---------------------测试调用枚举中写的方法-------------------------------"); Systemoutprintln("直接调用枚举里面的方法: "+ WeAreJavaergetInfomation()); }
3、来点更狠的。
你可以通过括号来给enum赋值,这样的话,你必须有带参的构造方法,还需要有一属性与方法,否则编译时会出错。
另外,你如果给enum里面的元素赋值的话,要么都赋,要么都不赋,不要东赋一个,西赋一个。
如果不赋值则不能写构造方法,如果你赋值了,而没有构造方法,编译还是通不过,废话不多少,来,看:
可赋值的enum代码
public enum People { xiaowang(20), xiaozhang(32),xiaoli(50), xiaogou(21); private final int age; People(int value) { //构造器只能是默认或者private, 从而保证构造函数只能在内部使用 thisage = value; } public int getAge() { return age; } }
好吧,啥也不说了,接下来的事,你懂地:
测试带值enum代码
public static void main(String[] args) {
for(People people:Peoplevalues()){
/通过getValue()取得相关枚举的值/
Systemoutprintln(people+" 的年龄 :"+peoplegetAge());
}
}
以上就是关于java 枚举 参数传递全部的内容,包括:java 枚举 参数传递、关于JAVA枚举的入门问题、java中如何将枚举值用循环输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)