黑马程序员技术交流社区
标题:
枚举中打印输出时,有关toString的问题
[打印本页]
作者:
燕国庆
时间:
2012-11-16 23:43
标题:
枚举中打印输出时,有关toString的问题
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Weekday weekday=Weekday.SUN;
//System.out.println(weekday==SUN);
//System.out.println(weekday.toString());
System.out.println(weekday.nextDay());
此处现实的结果为什么是MON(是字符串形式吗),weekday.nextDay()返回的结果不是Weekday类型的吗?此时把下面的toString方法注释掉后就不能显示MON这个结果了。若不注释的时候他是通过什么机制调用toString方法将SUN显示出来的?
//System.out.println(weekday.next());
}
}
public abstract class Weekday {
private Weekday(){}
public static final Weekday SUN=new Weekday(){
@Override
public Weekday nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public static final Weekday MON=new Weekday(){
@Override
public Weekday nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
/*public Weekday nextDay(){
if(this==SUN)
return MON;
else
return SUN;
}*/
public String toString(){
return this==SUN?"SUN":"MOM";
}
public abstract Weekday nextDay();
}
谢谢大家给个解释:)
作者:
徐军涛
时间:
2012-11-17 00:16
1,weekday.nextDay()为什么是MON
因为:你前面定义的weekday是SUN,又调用了nextDay()方法,所以就是MON
2,weekday.nextDay()返回的结果是Weekday类型的,
因为:weekday.nextDay().getClass().getName()其结果为:Weekday$1
3,此时把下面的toString方法注释掉后就不能显示MON这个结果了。
若不注释的时候他是通过什么机制调用toString方法将SUN显示出来的?
因为:注释掉就调用了Object的toString方法,打印的是SUN的地址值
作者:
张利
时间:
2012-11-17 00:59
打印一个对象 就相当于是打印它的toString方法返回的String字符串
如果没有定义toString,默认是Object中的定义,但是一般来说那个对于我们没有意义
因此在类中会重写toString方法来按照我们的希望输出打印
作者:
潘天功
时间:
2012-11-18 13:23
原因是JAVA中的toString()方法会被自动调用,如果你把toString方法复写了,那么在调用toString()方法时就会按照你复写的方法存在,如果没有复写toString()方法就会按照源代码中的操作进行操作。
作者:
凊係柈泩
时间:
2012-11-18 17:24
那么为什么会是MON,因为张老师在枚举类型对象中定义了几个常量,我们知道常量是不能修改的
这就是为什么用枚举的原因,Weekday抽象方法中使用了单例设计模式,这样我们就无法从外部去new对象
抽象方法无法创建实例,由子类newDay来覆盖了抽象方法,SUN这个常量在内部创建了对象并用匿名内部类
newDay方法创建返回值是MON,MON也同样创建了,然后覆盖了Object中toString方法并把常量值封装字符串常量,
这就说明为什么会打印出MON,和为什么会这样显示出来的原因
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2