Java 为什么Date类对象今天打印';s日期而不是日期类的引用
当我们创建一个对象时,该对象将引用一个类的数据成员和方法Java 为什么Date类对象今天打印';s日期而不是日期类的引用,java,date,Java,Date,当我们创建一个对象时,该对象将引用一个类的数据成员和方法 For Eg: TestObject obj = new TestObject(); System.out.println("Test Object is:"+obj); 据我所知,new运算符所做的是为指定的类(变量和方法)创建/分配内存块,并将该引用分配给左侧变量(obj)。因此,上面的print语句打印TestObject类的引用 但是,我的问题是,当我们为Date类创建一个对象并打印该对象时,它会打印今天的日
For Eg: TestObject obj = new TestObject();
System.out.println("Test Object is:"+obj);
据我所知,new运算符所做的是为指定的类(变量和方法)创建/分配内存块,并将该引用分配给左侧变量(obj)。因此,上面的print语句打印TestObject类的引用
但是,我的问题是,当我们为Date类创建一个对象并打印该对象时,它会打印今天的日期
For eg: Date date = new Date();
System.out.println("Date Object is:"+date);
上面的代码打印今天的日期。打印日期而不是日期类引用的原因和方式。请帮帮我
对不起,如果这是一个愚蠢的问题。即使这很愚蠢,我也不知道这个问题的答案
简短的解释将是可观的 当您使用实例的引用在内部打印时,它被称为类的
toString()
方法。在Date
类中,toString()
方法返回它包含的任何日期
日期toString()
方法表示
Converts this Date object to a String of the form:
dow mon dd hh:mm:ss zzz yyyy
如果您有意义地重写类中的
toString()
方法,则将打印从该方法返回的任何内容,而不是引用内存值。当您使用实例的引用在内部打印时,它被称为类的toString()
方法。在Date
类中,toString()
方法返回它包含的任何日期
日期toString()
方法表示
Converts this Date object to a String of the form:
dow mon dd hh:mm:ss zzz yyyy
如果您在类中有意义地重写了
toString()
方法,那么将打印从该方法返回的任何内容,而不是参考内存值。因为Date()
类的toString()
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT,Locale.US));
// zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
因为
Date()
类的toString()
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT,Locale.US));
// zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
由于
Date
中的toString()
实现,请查看源代码(链接到openjdk7实现)
Javadoc报价:
将此日期
对象转换为以下格式的字符串
:
道指周一至dd hh:mm:ss zzz yyyy
由于
Date
中的toString()
实现,请查看源代码(链接到openjdk7实现)
Javadoc报价:
将此日期
对象转换为以下格式的字符串
:
道指周一至dd hh:mm:ss zzz yyyy
正如其他答案正确指出的那样,Java中的所有类都有一个从超级父类继承的方法 每个类都应该重写“toString” 如果特定类的程序员选择不使用自己的实现重写
toString
方法,那么她的类将继承默认实现。默认实现输出您描述的变量引用信息。正如对象类doc所述,您实际上得到了这个
getClass().getName()+'@'+Integer.toHexString(hashCode())
对于toString
的重写实现,究竟应该做些什么?Sun/Oracle文档中说
通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于一个人阅读。建议所有子类重写此方法
辩论
许多程序员争论了在toString
中到底应该实现什么。问题在于toString
在各种上下文中使用。编程时,我们使用System.out.println
调用该方法,将值转储到控制台进行调试。另一个上下文是日志记录,在扩展测试期间记录值。或者我们可以在生产过程中进行此类日志记录。还有一个上下文正在生成一个字符串,用于在用户界面中显示消息或错误报告
一些程序员认为对象应该有多个这样的方法,以满足这些不同的目的。但是在Java中,每个对象都内置了一个这样的方法,toString
。你想怎么做就怎么做
java.util.Date—实现“toString”的错误方法
java.util.Date类的设计者决定,他们的toString
实现将获取一个日期的值,该日期实际上没有时区信息,然后应用的默认时区以一种古怪笨拙的格式输出日期时间
这种格式的一个缺点是使用了三个字母的时区代码。不幸的是,这些代码既不是标准化的,也不是唯一的,有常见的重复代码,如爱尔兰标准时间和印度标准时间的IST。避免使用这些三个字母的代码,而是使用
java.util.Date的toString
最糟糕的一点是,它给人一种非常混乱的印象,即日期有时区,而事实上它没有时区。这种混乱在StackOverflow和其他地方造成了层出不穷的重复问题。因此,java.util.Date是一个很好的案例研究,它研究了如何不编写toString
实现
幸运的是,经过很长时间的等待,旧的java.util.Date&java.util.Calendar类将被新的in类取代。此软件包的定义和灵感来自
Joda Time–实现“toString”的正确方法
是捆绑的java.util.Date/Calendar类的流行替代品。Joda Time是一个开源的免费库
Joda Time中对象的实现使用基于该格式的内置格式化程序。出于许多原因,ISO格式是一种很好的格式。一个原因是该标准清晰准确。另一个原因是,这种格式是直观的,无论文化规范如何,全球任何人都可以确定其含义。另一个优点是,作为一个没有空格的连续字符串,可以在程序中处理和解析它
DateTime dateTime_India = new DateTime( date, timeZone ); // Or… new DateTime( timeZone );
DateTime dateTime_UtcGmt = dateTime_India.toDateTime( DateTimeZone.UTC );
System.out.println( "date: " + date );
System.out.println( "timeZone: " + timeZone );
System.out.println( "dateTime_India: " + dateTime_India );
System.out.println( "dateTime_UtcGmt: " + dateTime_UtcGmt );