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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长石 中级黑马   /  2014-2-10 17:53  /  1889 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class TestWeek {

  2.         public static void main(String[] args) {
  3.                 Week day1=Week.SAT;
  4.                
  5.         }
  6.         public enum Week {
  7.                 MON("1"),TUE("2"),WED("3"),THU("4"),FRI("5"),SAT("6 "),SUN("0");
  8.                 String date;

  9.                 Week(String date){
  10.                         this.date=date;
  11.                         this.printDate();
  12.                        
  13.                 }
  14.                 public void printDate(){
  15.                         System.out.println(this.date);
  16.                 }
  17.         }

  18. }
复制代码

输出结果竟然是
1
2
3
4
5
6
0
以为应该输出SAT对应的date嘛?
为何全部都出来了? 而不是只打一个6

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
我的理解是:你要得到一个枚举类的实例对象时,枚举类肯定先把所有的对象创建出来,再返回给你你要的对象。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 尽量回答的详细些 你有你的理解 不错.

查看全部评分

回复 使用道具 举报
SAT("6 ")会调用哪个接受一个Sring参数的构造方法,其他的也一样,每实例化一个就会调用一次哪个有参的构造方法,而构造方法里面又会调用printDate方法,所以全部都会打印出来..

评分

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

查看全部评分

回复 使用道具 举报
e.c 发表于 2014-2-10 18:23
我的理解是:你要得到一个枚举类的实例对象时,枚举类肯定先把所有的对象创建出来,再返回给你你要的对象。 ...

你说的我大概能懂  但是为什么最后没再打出一个6呢?
回复 使用道具 举报
枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例。当在主函数中声明枚举变量并赋值时,枚举的所有实例需要完成初始化。初始化需要调用构造函数, 而构造函数调用了printDate方法,该方法打印出每个枚举实例的date,于是输出上面的结果。
如果想要单独再打印一个枚举实例对应的date,主函数可以这样写:
public static void main(String[] args) {
                Week day1=Week.SAT;
                System.out.println(day1.date);
        }

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
或者可以这样写:
public static void main(String[] args) {
      
        Week.SAT.printDate();
        
   
}
public enum Week {
        MON("1"),TUE("2"),WED("3"),THU("4"),FRI("5"),SAT("6 "),SUN("0");
        String date;

        private Week(String date){
                this.date=date;
              
               
        }
        public void printDate(){
                System.out.println(date);
        }
}          
输出结果为:6

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
加油   
回复 使用道具 举报
e.c 中级黑马 2014-2-11 10:47:56
8#
本帖最后由 e.c 于 2014-2-11 10:58 编辑
长石 发表于 2014-2-10 20:44
你说的我大概能懂  但是为什么最后没再打出一个6呢?

打出6了,枚举创建所有对象的时候就打印了:1 2 3 4 5 6 0
回复 使用道具 举报
长石 发表于 2014-2-10 20:44
你说的我大概能懂  但是为什么最后没再打出一个6呢?

关于这个问题,我的理解是:
构造函数的调用是在实例化对象时候,调用的。当你把Week.Sat赋值给Week day1时,先是实例化Week的7个对象,即调用了7次构造函数,打印出了7个值。但是 当你执行Week day1=Week.SAT时, Week.SAT对象已经创建了,因此不会调用构造函数;而对day1的赋值也没有产生新的对象, 产生新对象是有new Class的。这里仅仅是一个指向。因为屏蔽了指针,我不太清楚。我的理解是 day1指向了SAT对象,而没有产生新对象,因此没有调用构造函数,也没有打印所谓的6
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马