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

© 邓超军 中级黑马   /  2012-7-17 08:27  /  1711 人查看  /  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 赞一个!

查看全部评分

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