初学Java,枚举类(二十二)

news/2024/7/4 1:44:56 标签: java, string, c#, interface, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public enum Gender 
{
	MALE,FEMALE;
	private String name;
	public void setName(String name)
	{
		switch(this)
		{
			case MALE:
				if(name.equals("男"))
				{
				    this.name = name;
			    }
				else
			    {
					System.out.println("参数错误");
					return;
				}
			break;
			case FEMALE:
				if(name.equals("女"))
				{
				    this.name = name;
			    }
				else
			    {
					System.out.println("参数错误");
					return;
				}
			break;
		}
	}
	public String getName()
	{
		return this.name;
	}
}
class="language-class="tags" href="/tags/JAVA.html" title=java>java">
class="class="tags" href="/tags/JAVA.html" title=java>java">class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class TestGender 
{
	public static void main(String[] args) 
	{
		Gender g = Enum.valueOf(Gender.class,"FEMALE");
		g.setName("女");
		System.out.println(g + "代表:" + g.getName());
		//此时设置 name 属性时将会提示参数错误码
		g.setName("男");
		System.out.println(g + "代表:" + g.getName());
	}
}

对枚举类来说,应该设计成不可变类,因此上面的属性值不应该允许改变,这样是不安全的,因此对属性应使用final修饰符,必须在构造器里为这些属性指定初始值,因此应该为枚举类显式定义带参数的构造器MALE,FEMALE 这些枚举值代表枚举类的所有可能实例,所以MALE(参数),就等同于调用构造器,类实例(参数)
class="language-class="tags" href="/tags/JAVA.html" title=java>java">MALE("男"),FEMALE("女")这样的写法确实给人一种怪异的感觉
class="class="tags" href="/tags/JAVA.html" title=java>java" style="background-color: rgb(255, 255, 255); ">class="language-class="tags" href="/tags/JAVA.html" title=java>java">
class="class="tags" href="/tags/JAVA.html" title=java>java">public enum Gender 
{
	//此处的枚举值必须调用对应构造器来创建
	MALE("男"),FEMALE("女");
	private final String name;
	//枚举类的构造器只能使用private修饰
	private Gender(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
}

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class TestGender 
{
	public static void main(String[] args) 
	{
		Gender g = Enum.valueOf(Gender.class,"FEMALE");
		System.out.println(g + "代表:" + g.getName());

		g = Enum.valueOf(Gender.class,"MALE");
		System.out.println(g + "代表:" + g.getName());
	}
}
现在客户端不再有修改枚举类属性的权力了,呵呵
枚举类还可以实现一个或多个接口,C#的枚举类不支持这种做法
class="language-class="tags" href="/tags/JAVA.html" title=java>java">
class="class="tags" href="/tags/JAVA.html" title=java>java">class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class="tags" href="/tags/INTERFACE.html" title=interface>interface GenderDesc 
{
	void info();
}


public enum Gender implements GenderDesc 
{
	//此处的枚举值必须调用对应构造器来创建
	MALE("男")
	//花括号部分实际上是一个类体部分
	{
		public void info()
		{
			System.out.println("这个枚举值代表男性");
		}
	},
	FEMALE("女")
	{
		public void info()
		{
			System.out.println("这个枚举值代表女性");
		}
	};
	private final String name;
	private Gender(String name)
	{
		this.name = name;
	}
}

当创建MALE和FEMALE两个枚举值时,后面又跟着一对花括号,括号里又包含一个info方法定义.括号部分实际是一个类体部分,当创始MALE,FEMALE枚举值时,并不是直接创建了Gender枚举类实例,而是相当于创建Gender的匿名子类实例.所以这个部分与匿名内部类语法大致相似.
class="language-class="tags" href="/tags/JAVA.html" title=java>java">编译生成三个文件Gender.class,Gender$1.class,Gender$2.class,和之前内部类的生成名字结构一样,证明了以上结论,MALE和FEMALE是Gender匿名子类的实例,而不是Gender类的实例
class="language-class="tags" href="/tags/JAVA.html" title=java>java">枚举类可包含抽象方法,当然这个C#也是不支持的
class="language-class="tags" href="/tags/JAVA.html" title=java>java">
class="class="tags" href="/tags/JAVA.html" title=java>java">class="language-class="tags" href="/tags/JAVA.html" title=java>java">public enum Operation 
{
	PLUS
	{
		public double eval(double x,double y)
		{
			return x + y;
		}
	},
	MINUS
	{
		public double eval(double x,double y)
		{
			return x - y;
		}
	},
    TIMES
	{
		public double eval(double x,double y)
		{
			return x*y;
		}
	},
	DIVIDE
	{
		public double eval(double x,double y)
		{
			return x/y;
		}
	};
	//为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现
	public abstract double eval(double x,double y);
	public static void main(String[] args) 
	{
		System.out.println(Operation.PLUS.eval(3,4));
		System.out.println(Operation.MINUS.eval(5,4));
		System.out.println(Operation.TIMES.eval(5,4));
		System.out.println(Operation.DIVIDE.eval(5,4));
	}
}



http://www.niftyadmin.cn/n/1411526.html

相关文章

转 VB ListView控件各种操作详解

Private Sub Form_Load()ListView1.ListItems.Clear 清空列表ListView1.ColumnHeaders.Clear 清空列表头ListView1.View lvwReport 设置列表显示方式ListView1.GridLines True 显示网络线ListView1.LabelEdit lvwManual …

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

初学Java,对象的软,弱和虚引用(二十三)

java.lang.ref包下提供了三个类SoftReference,phantomReference WeakReference,分别代表软引用,虚引用和弱引用 C#中没有这些概念 强引用,最常见的引用,程序创建一个对象,并把这个对象赋值给一个引用变量,通过该引用来…

WMI使用小工具——WMI代码生成器(转)

说明:WMI Code Creator是微软提供的一个WMI代码生成工具,这个工具是微软在2005年5月提供的,微软对这个软件提供的说明如下: This code is not supported under any Microsoft standard support program or service. This code is …

angular ui-router,最适合的angular1的路由开发

1、引入&#xff08;cdn地址&#xff09; <script src"http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script><script src"https://cdn.bootcss.com/angular-ui-router/1.0.3/angular-ui-router.js"></scr…

初学Java,jar命令详解(二十四)

JAR文件是个压缩包&#xff0c;其实就是一个类库&#xff0c;相当于.net世界里面的dll&#xff0c;里面放的都是编译编码后生成的字节码文件(xxx.class)&#xff0c;另外会有一个清单文件META-INF/MANIFEST.MF 其文件也是可以数字签名的&#xff0c;所谓增强安全性罗。 下面罗列…

angular1组件-component

angular中有组件的概念 组件由主要由组件名、template、controller组成 定义一个组件的基本语法格式如下&#xff1a; angular.module(app,[]);//应用组件之前必须定义module。 //定义一个组件 angular.module(app).controller(phoneList,{template:"<ul><li …

Beyond Compare同步功能简介

Beyond Compare是一款全球性价比最高的专业文件对比工具&#xff0c;他可以进行文件夹、文本的比较&#xff0c;而且还有同步的功能&#xff0c;下面我们就一起来探讨Beyond Compare同步功能吧&#xff01; 功能&#xff1a;同步代码&#xff0c;同步文件 在比较界面右键&#…