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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© py强子 中级黑马   /  2013-8-9 12:44  /  2000 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 py强子 于 2013-8-9 18:16 编辑

如果一个枚举类被抽象,还能自定义构造方法吗?
public enum TrafficLamp {
RED,GREEN,YELLOW

public abstract TrafficLamp  nextLamp();

private int time;
private TrafficLamp(int time)
{
  this.time = time;
}

}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

9 个回复

倒序浏览
首先,一个枚举类中如果包含了抽象方法,那么枚举值就是这个枚举类的子类对象,而非直接对象。
因此,你这个问题等同于问一个抽象类是否可以具有构造方法。答案是可以,因为抽象类中可以具有成员属性,而有成员属性就涉及到了初始化问题,就可能会用到构造方法。事实上在你创建一个抽象类的子类对象时,子类的构造方法会先访问父类的构造方法。
同理,你的枚举类中的枚举值对象在初始化时,会用到父类的构造方法,因此其父类(也就是这个枚举类)中可以包含构造方法。

另外,你写的这个枚举类中既然包含了抽象方法,那么在声明枚举值时就要去实现这个方法,否则会编译失败。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public enum TrafficLamp {
  2. RED,GREEN,YELLOW

  3. public abstract TrafficLamp  nextLamp();

  4. private int time;
  5. private TrafficLamp(int time)
  6. {
  7.   this.time = time;
  8. }
  9. }
复制代码
你这段代码,只是抽象了 枚举类中的一个方法,自定义构造函数是没问题的,但是你要对3个枚举值对象需要覆写你抽象了的那个方法public abstract TrafficLamp  nextLamp();

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,抽象类也是有构造方法的,用来给子类构建实例对象使用,而枚举本身就是一种类,所以即使枚举类本身是抽象的,依然可以定义构造方法;
另外,每个枚举元素都是用枚举类构建的对象,如果没有构造方法,如何定义枚举元素,所以,无论如何都可以定义构造方法;
只不过有抽象方法的枚举类在构建元素的时候一定要重写抽象方法;
这些张孝祥老师的java高新技术都有的

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
抽象类也是有构造方法的,用来给子类构建实例对象使用,而枚举本身就是一种类,所以即使枚举类本身是抽象的,依然可以定义构造方法;
另外,每个枚举元素都是用枚举类构建的对象,如果没有构造方法,如何定义枚举元素,所以,无论如何都可以定义构造方法;
只不过有抽象方法的枚举类在构建元素的时候一定要重写抽象方法;
回复 使用道具 举报
longlangcx 发表于 2013-8-9 14:02
首先,一个枚举类中如果包含了抽象方法,那么枚举值就是这个枚举类的子类对象,而非直接对象。
因此,你这 ...

OK,谢啦!
回复 使用道具 举报
longlangcx 发表于 2013-8-9 14:02
首先,一个枚举类中如果包含了抽象方法,那么枚举值就是这个枚举类的子类对象,而非直接对象。
因此,你这 ...

张孝祥老师的基础加强我也看了部分,你说的这些我都懂,但是还有疑问,
我们知道如果枚举类中有抽象方法,那么创建对象的时候必须重写父类的抽象方法,
在对象后面可以用()给对象传参,新建子类对象的时候是会调用到父类的构造方法,
但是我们new的构造方法不是子类的么,那么我们没写子类构造方法那就是默认无参构造器咯,
那怎么可以而且必须按照父类的构造方法的参数格式传入参数,并且此参数还可以作为子类对象的参数?
并且父类的构造方法是private私有的啊,即使可以运行也与子类没有关系啊!
我发个没根据父类构造函数的格式传参的错误代码求高手解惑
  1. package com.itheima.prepare;

  2. public enum EnumBestTest {
  3.         // 虽然是用子类创建的对象,但是在new子类对象的时候还是会调用父类的造方法???????

  4.         SUN {
  5.                 @Override
  6.                 public EnumBestTest nextDay() {
  7.                         // TODO Auto-generated method stub
  8.                         return MON;
  9.                 }
  10.         },
  11.         MON {
  12.                 @Override
  13.                 public EnumBestTest nextDay() {
  14.                         // TODO Auto-generated method stub
  15.                         return TUE;
  16.                 }
  17.         },
  18.         TUE {
  19.                 @Override
  20.                 public EnumBestTest nextDay() {
  21.                         // TODO Auto-generated method stub
  22.                         return WED;
  23.                 }
  24.         },
  25.         WED {
  26.                 @Override
  27.                 public EnumBestTest nextDay() {
  28.                         // TODO Auto-generated method stub
  29.                         return THI;
  30.                 }
  31.         },
  32.         THI {
  33.                 @Override
  34.                 public EnumBestTest nextDay() {
  35.                         // TODO Auto-generated method stub
  36.                         return FRI;
  37.                 }
  38.         },
  39.         FRI {
  40.                 @Override
  41.                 public EnumBestTest nextDay() {
  42.                         // TODO Auto-generated method stub
  43.                         return SAT;
  44.                 }
  45.         },
  46.         SAT {
  47.                 @Override
  48.                 public EnumBestTest nextDay() {
  49.                         // TODO Auto-generated method stub
  50.                         return SUN;
  51.                 }
  52.         };
  53.         public abstract EnumBestTest nextDay();

  54.         private int time;
  55.        
  56.         private EnumBestTest(int time) {
  57.                 this.time = time;
  58.         }

  59. }
复制代码
回复 使用道具 举报
封号了... 发表于 2013-8-10 02:34
张孝祥老师的基础加强我也看了部分,你说的这些我都懂,但是还有疑问,
我们知道如果枚举类中有抽象方法 ...

你问的这个基本属于是继承和匿名内部类的知识。
创建匿名内部类本身就是一种特殊的语法,因为匿名,所以无法拥有自己的构造器,但是既然继承自父类,而父类可能有自己的成员属性需要被初始化,因此自然需要调用父类的构造器,而调用构造器可能需要一些外部传递进来的数据,因此就直接把这些外部数据通过父类名(实参列表){}的形式传给父类。
至于你说的父类构造方法是private的问题,因为匿名内部类是定义在枚举类内部的,所以自然可以访问外围类的private成员。
至于你写的这个程序,因为包含了abstract方法,所以枚举值都是子类对象,而你写匿名内部类时又没有写参数列表,父类又没有无参构造器,所以应该是报错才对。
回复 使用道具 举报
哦哦,内部类知识还有所欠缺,再去补补{:soso_e130:}
多谢:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马