黑马程序员技术交流社区

标题: 两个语句有什么不同? [打印本页]

作者: 邓超军    时间: 2012-7-16 11:50
标题: 两个语句有什么不同?
本帖最后由 邓超军 于 2012-7-17 18:13 编辑
  1. class Employee
  2. {
  3.         private Date hireDay;
  4.         public Date getHireDay()
  5.         {
  6.                 //return hireDay; 为什么这句是错误的?或者说为什么不要这么写?
  7.                 return (Date)hireDay.clone();//和return hireDay有什么区别?
  8.         }
  9. }
复制代码

作者: 陆鹏    时间: 2012-7-16 12:27
你确定这样能执行?
class Employee

{

        private Date hireDay;

        public Date getHireDay()

        {

                //return hireDay;    private Date hireDay。这个语句只是声明了hireDay是个Date类型的变量,而没有实例化。
                return (Date)hireDay.clone();//和return hireDay有什么区别? 这样对吗?hireDay还没有实例化,你就用了clone方法,而且clone()放回的是Object类型的副本,当然需要强转。
        }

}


作者: 党巾水    时间: 2012-7-16 12:29
本帖最后由 刘馨琪 于 2012-7-16 12:31 编辑

return hireDay;
楼主确定这句话有错吗?
我运行时这句话对,反而是return (Date)hireDay.clone();报错了。
报的 java.lang.NullPointerException,空指针异常。
作者: 邓超军    时间: 2012-7-17 09:17
实在抱歉,return hireDay;这个语句没有错,是我提问错了。今天我弄了4个小时,终于明白了,这句语句是没有错,但存在bug,请看以下代码,就会明白。
代码1:
  1. import java.util.*;
  2. public class EmployeeDemo {
  3.         public static void main(String[] args) {
  4.          Employee ep=new Employee(2011,9,18);
  5.          Date dt=ep.getHireDay();
  6.          System.out.println(ep.getHireDay());
  7.          double te=10*365.25*24*60*60*1000;
  8.          dt.setTime(dt.getTime()+(long)te);
  9.          System.out.println(ep.getHireDay());
  10.         }

  11. }

  12. class Employee
  13. {
  14.         private Date hireDay;
  15.         public Date getHireDay()
  16.         {
  17.                 return hireDay;
  18.         }
  19.         Employee(int year,int month,int day)
  20.         {
  21.                 GregorianCalendar gc=new GregorianCalendar(year,month-1,day);
  22.                 hireDay=gc.getTime();
  23.         }
  24. }
复制代码
运行结果:
Sun Sep 18 00:00:00 CST 2011
Fri   Sep 17 12:00:00 CST 2021

代码2:
  1. import java.util.*;
  2. public class EmployeeDemo {
  3.         public static void main(String[] args) {
  4.          Employee ep=new Employee(2011,9,18);
  5.          Date dt=ep.getHireDay();
  6.          System.out.println(ep.getHireDay());
  7.          double te=10*365.25*24*60*60*1000;
  8.          dt.setTime(dt.getTime()+(long)te);
  9.          System.out.println(ep.getHireDay());
  10.         }

  11. }

  12. class Employee
  13. {
  14.         private Date hireDay;
  15.         public Date getHireDay()
  16.         {
  17.                 return (Date)hireDay.clone();
  18.         }
  19.         Employee(int year,int month,int day)
  20.         {
  21.                 GregorianCalendar gc=new GregorianCalendar(year,month-1,day);
  22.                 hireDay=gc.getTime();
  23.         }
  24. }
复制代码
运行结果:
Sun Sep 18 00:00:00 CST 2011
Sun Sep 18 00:00:00 CST 2011





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