黑马程序员技术交流社区

标题: 为什么会打印出“MON”? [打印本页]

作者: 夏德宇    时间: 2013-12-22 14:20
标题: 为什么会打印出“MON”?

  1. public class EnumTest {
  2.         public static void main(String[] args) {
  3.                 WeekDay weekDay = WeekDay.SUN;
  4.                 System.out.println(weekDay.nextDay());
  5.         }
  6. }

  7. class WeekDay {
  8.         private WeekDay(){}
  9.        
  10.         public final static WeekDay SUN = new WeekDay();
  11.         public final static WeekDay MON = new WeekDay();
  12.        
  13.         public WeekDay nextDay(){
  14.                 if(this == SUN){
  15.                         return MON;
  16.                 } else {
  17.                         return SUN;
  18.                 }
  19.         }
  20.        
  21.         public String toString(){
  22.                 return this == SUN ? "SUN" : "MON";
  23.         }
  24. }
复制代码


应该是打印出对象的形式啊,为什么会打印出 “MON”?
作者: 夏德宇    时间: 2013-12-22 14:29
查了一下,System.out.println(对象),在当前对象中,没有覆盖toString方法的情况下,这语句可以打印出该对象的类名,哈希码等等
作者: 776699    时间: 2013-12-22 14:30
本帖最后由 776699 于 2013-12-22 14:40 编辑

你不是调用了nextDay()方法嘛,问题就出在这个方法上,你的weekDay 不就是与SUN吗,相等毫无疑问的啊,既然该条件为真肯定返回MON啦,而且你重写了toString方法,所以打印出了MON.
        public WeekDay nextDay(){
                if(this == SUN){//你的weekDay 不就是与SUN吗,相等毫无疑问的啊,既然该条件为真肯定返回MON啦,而且你重写了toString方法,所以打印出了MON
                        return MON;
                } else {
                        return SUN;
                }
        }
        
        public String toString(){
                return this == SUN ? "SUN" : "MON";
        }

作者: 夏德宇    时间: 2013-12-22 14:34
查了一下,当一个Object实例被转化成String时,Java就会自动调用toString()方法返回一个String。System.out.println标准输出,只能输出String,所以,所有需要输出的Object都会被转化成String,Java会自动调用Object的toString()。
作者: 夏德宇    时间: 2013-12-22 14:35
776699 发表于 2013-12-22 14:30
SUN = new WeekDay();是一个新的对象,有一个新的内存地址值,不同的内存地址比较所以返回false,所以为,M ...

谢谢……
作者: 776699    时间: 2013-12-22 14:44
夏德宇 发表于 2013-12-22 14:34
查了一下,当一个Object实例被转化成String时,Java就会自动调用toString()方法返回一个String。System.out ...

这里你重写了toString方法,当然会打印自定义的字段了,不重写的话会打印对象
作者: 青菜白汤    时间: 2013-12-22 15:02
首先,你已经在这段代码初始化默认WeekDay为sun  
  1. public class EnumTest {
  2.         public static void main(String[] args) {
  3.                 WeekDay weekDay = WeekDay.SUN;
  4.                 System.out.println(weekDay.nextDay());
  5.         }
  6. }
复制代码


然后你在if语句中判断this==sun,条件成立,自然是输出MON
  1.   public WeekDay nextDay(){
  2.                 if(this == SUN){
  3.                         return MON;
  4.                 } else {
  5.                         return SUN;
  6.                 }
  7.         }
复制代码

作者: 夏德宇    时间: 2013-12-22 18:21
776699 发表于 2013-12-22 14:30
你不是调用了nextDay()方法嘛,问题就出在这个方法上,你的weekDay 不就是与SUN吗,相等毫无疑问的啊,既然 ...

谢谢……
作者: 夏德宇    时间: 2013-12-22 18:22
青菜白汤 发表于 2013-12-22 15:02
首先,你已经在这段代码初始化默认WeekDay为sun  

谢谢……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2