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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓超军 中级黑马   /  2012-7-17 08:27  /  1508 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class AdvJava {
  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.         new WeekDay(){
  5.                
  6.         };//张老师说枚举是一个特殊的类,那为什么这句语句会报错?
  7.         new WeekDay();//这句也不行,为什么?
  8.         }

  9.         public enum WeekDay{
  10.                 SUN{
  11.                         public WeekDay nextDay()
  12.                         {
  13.                                 return MON;
  14.                         }
  15.                 },MON{
  16.                         public WeekDay nextDay()
  17.                         {
  18.                                 return SUN;
  19.                         }
  20.                 };
  21.                 public abstract WeekDay nextDay();
  22.                 private WeekDay(){}
  23.         }
  24. }
复制代码

7 个回复

倒序浏览
枚举的构造函数是私有的肯定不能创建对象了
回复 使用道具 举报
因为你在下面定义了一个抽象的nextDay()方法,因而你上面在new WeekDay()的时候必须得实现这个方法!
回复 使用道具 举报

  • public class AdvJava {
  •         public static void main(String[] args) {
  •                 // TODO Auto-generated method stub
  •         new WeekDay(){
  •         }; //下面私有了,不能创建对象了。况且枚举的引用不是这样创建对象的。
  •        new WeekDay();   //同上,况且枚举不是这样创建对象的。而是类似于静态的方法,WeekDay.SUN ,这样就是直接创建了一个枚举类型的对象。
  •         }
  •         public enum WeekDay{
  •                 SUN{
  •                         public WeekDay nextDay()
  •                         {
  •                                 return MON;
  •                         }
  •                 },MON{
  •                         public WeekDay nextDay()
  •                         {
  •                                 return SUN;
  •                         }
  •                 };
  •                 public abstract WeekDay nextDay();
  •                 private WeekDay(){}   //你这里已经将空参数构造函数私有了,也就是不能创建对象了。
  •         }
  • }
  • 建议:感觉楼主基础不太扎实,应复习下基础部分,再看加强。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
枚举是一个特殊的类,因为他本身的构造方法是私有的,导致我们不能new实例化对象,
枚举中每个元素都是对象
并且制定好了元素的取值范围
回复 使用道具 举报
//下面私有了,不能创建对象了。况且枚举的引用不是这样创建对象的。

我想说的是,即使不私有,也不行。而且,我感觉大家都没有回答到关键点:为什么枚举与一般的类不同?
回复 使用道具 举报
王飞 中级黑马 2012-7-17 09:49:36
7#
public class Test2 {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
        //new WeekDay(){
               
        };//张老师说枚举是一个特殊的类,那为什么这句语句会报错?   这里的的都好是中文的 改了就OK
       // new WeekDay();//这句也不行,为什么?  个么,枚举类不能new对象的,因为他里面的构造方法是私有的,只能通过类名调用里面的成员
      
       例如:WeekDay w = WeekDay.SUN;
        WeekDay w = WeekDay.MON;就OK了
        此时返回的就是WeekDay 类型的对象

        
         枚举类之所以与一般的类不同,是因为他的构造方法是私有的
         ,里面的每个元素都是WeekDay的实例对象,也就是说枚举里面定义好了一些实例对象,要用这个枚举类的对象就只能是这个枚举类里面据有的元素(每个元素都是这个枚举类实例后的对象)

      
         枚举类里面的元素都是通过类名直接调用的,因为枚举类里面的元素默认都是public static final的

        }

        public enum WeekDay{
                SUN{
                        public WeekDay nextDay()
                        {
                                return MON;
                        }
                },MON{
                        public WeekDay nextDay()
                        {
                                return SUN;
                        }
                };
                public abstract WeekDay nextDay();
                private WeekDay(){}
        }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
程潇 中级黑马 2012-7-17 09:54:07
8#
这个问题考察了带有构造方法的枚举的初始化。
先总结一下枚举的知识点:
  • 枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象
  • 枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法
  • 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分割。把枚举中的成员方法或变量放在枚举元素的前面,编译器会报告错误。
  • 带构造方法的枚举:a.构造方法必须私有;b.若有多个构造方法,选择方式同普通类;c.枚举元素MON和MON()的效果一样,都是调用默认的构造方法
  • 带方法的枚举:a.定义枚举TrafficLamp;b.实现普通的next方法;c.实现抽象的next方法时:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义;d.增加表示时间的构造方法
  • 枚举只有一个成员时,就可以作为一种单例的实现方式。


感觉你写new WeekDay()是为了测试枚举类生成对象吧。可是枚举类中的对象已经在定义枚举时就已经限定为SUN和MON了。(我理解者应该是枚举类和一般类最大的不同)
也就是你不能在枚举类限定的对象范围之外再重新去创造新的对象。


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