A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
我想问的是 枚举可以继承一个类吗  可以实现一个接口吗   
面试的时候我被问到了  蒙了半天   
下面是我在网上找到的答案  希望对大家理解有帮助  

1.Java 5 新增,是类类型,但不能使用new 不能继承其他类,也不能作为超类,即不能扩展.但隐式继承自java.lang.Enum类,可以实现接口.





评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
网上找了个  枚举实现接口的例子

  java 中一个典型的枚举类型,看似字符串值,但包含一些附加的信息,包括排序以及附加的方法可以获取枚举值的信息。

  下面是一个基本的枚举类型:

  

  public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }

  可增加附加信息,例如私有构造器、私有属性等,如下:

  

  public enum Numbers {

  One(1), Two(2), Three(3);

  private Numbers(int value)

  public int getValue()

  private int value;

  在上面的例子中,我们引入了 getValue() 方法,这便是枚举的行为定义。

  接下来我们要做的是枚举类型对接口的继承以及实际的用途。

  为了显示工作过程,我们首先做一个接口,用来实现类和数据库表的一个映射:

  

  public interface DatabaseMapping {

  public String getType();

  public boolean isKey();

  public boolean isNullable();

  //public String name();

  name() 方法这个时候被注释掉,待会我们会取消注释。

  接下来我们创建一个新的 Java 类用以定义和数据库之间的映射关系:

  

  public class Person {

  public String getFirstname() {

  return firstname;

  public void setFirstname(String firstname) {

  this.firstname = firstname;

  public String getLastname() {

  return lastname;

  public void setLastname(String lastname) {

  this.lastname = lastname;

  public int getAge() {

  return age;

  public void setAge(int age) {

  this.age = age;

  private String firstname;

  private String lastname;

  private int age;

  然后我意识到了,其实有更好的方法来映射一个类到数据库表,上面这个例子很做作。当我们定义了映射到表的类时,我们需要定义一个独立的映射类,但实际上用枚举更好,数据库表中的字段可以是枚举的成员。

  例如下面这样写不是更简单吗?

  

  public enum PersonMapping {

  personId, firstname, lastname, age;

  而且我们可以通过给枚举类型附加一些方法来实现数据库映射的细节:

  

  public enum PersonMapping {

  personId(INTEGER, true, false),

  firstname(TEXT, false, false),

  lastname(TEXT, false, false),

  age(INTEGER, false, false);

  private PersonMapping(String type, boolean key, boolean nullable )

  this.type = type;

  this.key = key;

  this.nullable = nullable;

  public String getType() {

  return type;

  public boolean isKey() {

  return key;

  public boolean isNullable() {

  return nullable;

  private final String type;

  private final boolean key;

  private final boolean nullable;

  现在我们可以使用这个枚举来迭代所有字段并创建相应的表:

  

  public String dbTableCreate(String tableName) {

  StringBuilder builder = new StringBuilder(Create table );

  builder.append(tableName);

  builder.append(();

  builder.append(column.name());

  builder.append( );

  builder.append(column.getType());

  builder.append(column.isKey() ? primary key : );

  builder.append(, );

  builder = new StringBuilder(builder.substring(0, builder.length() - 2));

  builder.append(););

  return builder.toString();

  这个 PersonMapping 枚举类型看起来不错,但是它不允许我们使用不同的类到数据库的映射,因此我们需要抽象,需要接口。从上面的代码看,我们需要枚举类型两个通过的方法:name() 和 values(),第一个方法返回当前枚举值的名字,第二个就是列出所有的枚举值。

  首先,我们为枚举添加一个接口:

  

  public enum PersonMapping implements MappingEnum{

  ....

  然后注释掉我们前面提到的 name() 方法:

  

  public interface MappingEnum {

  public String getType();

  public boolean isKey();

  public boolean isNullable();

  public String name();

  最后我们编写一个 dbTableCreate() 方法来让其他的枚举类型可重用这个方法:

  

  public String dbTableCreate(String tableName, MappingEnum[] values) {

  StringBuilder builder = new StringBuilder(Create table );

  builder.append(tableName);

  builder.append(();

  for (MappingEnum column : values) {

  builder.append(column.name());

  builder.append( );

  builder.append(column.getType());

  builder.append(column.isKey() ? primary key : );

  builder.append(, );

  builder = new StringBuilder(builder.substring(0, builder.length() - 2));

  builder.append(););

  return builder.toString();

  讲解就到此结束,我们得出了一些结论:

  枚举类型可以存储附加的数据和方法

  枚举类型可通过接口来定义行为

  枚举类型的项行为可通过接口来访问,跟正常的 Java 类无异

  values() 方法可用来返回接口中的一个数组

  总而言之,你可以像使用普通 Java 类一样来使用枚举类型。
回复 使用道具 举报
本帖最后由 杨浩 于 2013-1-31 04:04 编辑

当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。
而且枚举可以实现接口的
  1. enum Animal implements Eat{
  2.         Dog(){
  3.                 @Override
  4.                 public void eat() {
  5.                         System.out.println("狗吃骨头");
  6.                 }
  7.         },
  8.         Cat(){
  9.                 @Override
  10.                 public void eat() {
  11.                         System.out.println("猫吃鱼");
  12.                 }
  13.         }
  14. }
  15. interface Eat{
  16.         public void eat();
  17. }
  18. public class Demo {
  19.         public static void main(String[] args) {
  20.                 Animal.Dog.eat();
  21.                 Animal.Cat.eat();
  22.         }
  23. }
复制代码
我要抓紧赚分。。。已经提交了入学测试题,等面试了通知了,还差好多分,我尽量多发一些遇到过的有嚼头的问题。。求版主加分
还有,版主,别人已经回答过的问题,几天内的帖子,写回复会被你加分呀?当然回复会是自己认真思考的


点评

额。。没明白最后一句话的意思  发表于 2013-1-31 11:28

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
                                                                                                                                                                        [size=12.000000pt]枚举中每个元素都是该枚举类的一个对象,没创建一次枚举类,都要建立类中的对象。在枚举
                                        [size=12.000000pt]类中也可以定义构造方法和抽象函数。例下面代码:
  1.   public class Test1
  2.   {
  3.       public static void main(String[] args)
  4.       {
  5.           Week weekday2 = Week.Fri;
  6.           System.out.println(weekday2.toLocaleString());
  7.       }
  8.          
  9.       public enum Week
  10.       {
  11.           Mon("星期一"),
  12.           Tue("星期二"),
  13.           Wen("星期三"),
  14.           Thu("星期四"),
  15.           Fri("星期五"),
  16.           Sat("星期六"),
  17.           Sun("星期日");
  18.                   
  19.           public String day;
  20.           private Week(String day)
  21.               {
  22.                   this.day = day;
  23.                   System.out.println("Constructor"+this.day);
  24.               }
  25.       }
  26.   }
复制代码
[size=12.000000pt]上面的代码中,Week 这个枚举中有 7 个元素,即由 7 个对象。Week 枚举类中还定义了一个成员变量 day 和一个构造函数,构造函数接受一个字符串类型的参数。这行代码 /Mon(``星期一''),/ 表示创建了一个 Week 的枚举对象,并向构造函数传递参数'' 星期一''。因此,上面代码的打印结果是:
                               
                       
               
       

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马