Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Date类对象今天打印';s日期而不是日期类的引用_Java_Date - Fatal编程技术网

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 );