初探Java中的枚举类型

    我们都知道枚举类型是jdk1.5,也就是jdk5.0这个版本中新增加的一种引用数据类型。那回忆下我们所知道的java中的数据类型,java中的数据类型可以分为基本数据类型和引用数据类型。基本数据类型代表的是一种简单的数据结构,比如说我们经常所说的整型,浮点型,字符型,布尔型等。而在java当中有一种特殊的数据类型,我们叫做引用数据类型,而引用数据类型一共有四种,略懂java的人是知道的,这四种分别是类、数组、接口以及今天我要重点讲述的枚举。关于其他三种数据类型有机会我们再在一起讨论。

那么到底什么是枚举,枚举的作用是什么呢?枚举类型最主要的作用是限定类型的取值。在jdk1.5之前没有产生枚举,那么我们来看一个例子!

我们首先要定义一个类,这个类是人类,非常简单!

public class Person{

 

}

就可以了,那么我们知道,类是用来描述一组具有相同属性(域)和方法的一个抽象。那么我们都应该清楚每一个人类的对象,也就是说每个人类的具体个体都具有相同的一些属性,比如说姓名,年龄等。那么我们就可以在以上类当中加入相应的属性。

public class Person{

       //名字

       private String name;

       //年龄

private int age;

}

       这里都比较容易理解,那么我们去看另外一个属性,这个属性我们叫做性别,总所周知,这个属性的取值只有两种,那么有和我较劲的同学不要提人妖这回事,人妖忽略。那么我们会发现,性别这个属性既然只有两个值,那么我们应该给这个属性定义为什么类型呢!有的同学说随便啊,比如说String类型就可以啊!那么我们来看一下,如果把性别属性定义为String类型会出现什么状况。

public class Person{

       //名字

       private String name;

       //年龄

private int age;

//性别

private String sex;

//构造器

public Person(String name,int age,String sex){

      this.name = name;

      this.age = age;

      this.sex = sex;

}

}

上面的例子我们看到,我添加了一个属性是性别,之后加入一个构造器,构造器最主要的作用是通过类来创建对象,上面的构造器是说当你创建一个人类对象的时候需要知道这个人的名字,年龄,以及性别。好了,那么我们来创建一个人类的对象,语法非常简单!

Person p = new Person(“杨过”,32,””);

我们一看,这是没有任何问题的,我们抛开名字和年龄不说,只看他的性别。

Person这个类我们会发现,创建这个类的对象的时候构造器的第三个参数只要是字符串就可以了,那么我们可以不可以这么写。

Person p = new Person(“杨过”,32,”大家好”);

这句话在语法上我们看有错吗?答案是没有,因为构造器的第三个参数就是字符串,那么我传一个字符串给构造器当然一点问题都没有。虽然语法上没有任何问题,但是我们看这个对象在创建上是不合理的,为什么呢?因为性别只有男和女之分,不能有其他的!有聪明的人已经想到了,那么我们可以把sex性别这个属性定义为boolean类型啊!因为boolean类型只有两个取值,那么我们传参的时候就可以穿true或者false,用true代表男人,用false代表女人,那么可以不可以?当然没问题,可是为题是为什么要用true代表男人,不用true代表女人啊!你会想到其实无所谓了true代表谁都可以,只要之前我们有一个规定就可以了!可逆会发现truefalse根本就没有直观性!那么这么多问题,我们到底要怎么解决呢!

jdk1.5之前,java程序员的解决此类限定类型的值的时候用了一个非常巧妙的方法!他想到了新定义一个类型,这个类型只有两个值,这两个值,一个是男一个是女。那么怎么才能做到呢!好,我们先定义一个类型,怎么定义类型!我们说过类就是一种引用类型,那么引用类型的值是什么,之前我们讲过那就是对象。好了,我们现在要做的是创建一个类,这个类只能创建两个对象!

public class Sex{

 

}

 

首先我们要考虑,这个类只能创建两个对象,我们会想到我们之前学过的单例设计模式中,要求一个类只能创建一个对象。这其实是一个道理的。我们要考虑创建对象要用到构造器,那么构造器不可能是public的,如果构造器是public那么我们就可以创建无数个对象。好了,那么我们在上面的类当中加入构造器,这个构造器一定是私有的。

public class Sex{

       private Sex(){

}

}

那么我们可以在这个类中加入属性。

public class Sex{

       private String sex;

public static final Sex MALE = new Sex(“”) ;

       public static final Sex FEMALE = new Sex(“”);

private Sex(String sex){

       this.sex = sex;

}

}

关于这个例子我们可以看到,这个类只有两个对象,这两个对象分别是Sex类中的两个属性。

之后我们可以将我们Person这个类的例子稍做修改。

public class Person{

       //名字

       private String name;

       //年龄

private int age;

//性别

private Sex sex;

//构造器

public Person(String name,int age,Sex sex){

      this.name = name;

      this.age = age;

      this.sex = sex;

}

}

这个时候,我们创建这个对象的时候,如何创建呢?非常简单。

Person p = new Person(“杨过”,32,new Sex(“”));

我们看可以吗?

很明显是不可以的,因为Sex构造器是私有的,怎么办,Person构造器的第三个参数又需要Sex类型,到这里我们会发现,Sex类型的值只有两个分别是在Sex类中是静态的常量而且是公有的,那就好办了!我们可以通过这种方式创建对象!

Person p = new Person(“杨过”,32,Sex.MALE);

这个时候我们就可以看到这个人是个男人,因为我们知道maleSex类中定义为男人!而且应为也是男人的意思!有直观又方便,那么有人说,我想看看他到底是男人还是女人怎么办!

你会想到,把属性打印出来就可以了!

System.out.println(p.sex);

这个时候,打印的是这个对象的hashCode,我们只要在Sex类中加入toString方法就可以了!

 

到这里,我们会发现人类中有一个sex属性,这个属性是Sex类型的,而且这个属性只有两个取值。那么以后我们在遇到这种限定类型的时候就可以用这种方法。比如说血型等。

那么我们说了半天还没谈到枚举呢!其实在上面的文字中,我们已经不知不觉阐述了枚举的原理!枚举就是将新的类型做一个限定。我们来创建一个枚举。

 

public enum Sex{

       MALE(“”),FEMALE(“”);

}

这就是枚举,这里是将Sex所有可能的取值都列举到这个枚举中,如果一个属性定义为枚举类型,只能到这个枚举中区寻找他的值!好了,我们改一下!

public class Person{

       //名字

       private String name;

       //年龄

private int age;

//性别

private Sex sex;

//构造器

public Person(String name,int age,Sex sex){

      this.name = name;

      this.age = age;

      this.sex = sex;

}

}

创建对象的时候,同样

Person p = new Person(“杨过”,32,Sex.MALE);

就可以,这就是枚举!当然枚举还有很多东西需要大家去学习,但今天就说到这了,等有机会再深一步的去讲解!

 下一次我们讲多态。

更多问题请添加微信:helloxjc

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值