Java 返回原值的引用还是拷贝的引用

Java 返回原值的引用还是拷贝的引用

Java 中函数参数传递和函数返回值都是以值方式传递的。当然,对于对象,我们也可以说是引用的方式传递,其实传递也是值,只不过是引用值。引用是一个对象的别名,对于引用的修改就是对于对象本身的修改。

为了便于理解还是可以说成是两种类型,原始类型以值方式传递,对象以引用方式传递。

向函数里传递参数,已经有很多java教程讲解了。这里主要记录一个 函数返回值的问题。在返回一个对象时,是返回值本身的应用,还是拷贝这个值,再传拷贝的引用呢。这是需要考虑清楚的。

这个问题,是我在 不同手机上调试 J2ME 程序时遇到的。

具体如下,这是一个关于时间的工具类。我发觉 Calendar 的 getTime() 在有的机器下 如 Nokia,返回的 Calendar 当前时间的一个拷贝的引用,而 SAMSUNG 则直接返回 Calendar 的当前时间的引用。这导致,我在想得到一个时间所在那一的起始时间和结束时间时,总是得到相同的值,即后一次调用的值。按照,比较正常的理解,这里应该返回拷贝的引用比较正确,就是说 SAMSUNG 的 JVM 实现有些问题。面对这种情况,我只能先用 Date 类 返回 一个 long 值,再用 long 值构造一个新日期,即日历当前日期的拷贝,返回这个拷贝。

修改函数中的最后一行为
return new Date(fCalendar.getTime().getTime());

     private   static  Date fCalendar  =  Calendar.getInstance();


    
/**
             * Get the beginning of a day
             * 
@param  date <description>
             * 
@return  <description>
             
*/
    
public   static  Date getBeginOfDay(  final  Date pDate ) {
        
       fCalendar.setTime( pDate );
       
try {
           fCalendar.set( Calendar.HOUR_OF_DAY, 
0  );
           fCalendar.set( Calendar.MINUTE, 
0  );
           fCalendar.set( Calendar.SECOND, 
0  );
        }
catch (ArrayIndexOutOfBoundsException ex){
            ex.printStackTrace();
        } 
        
return  fCalendar.getTime();
    }
   
    
/**
             * Get the end of a day
             * 
@param  date <description>
             * 
@return  <description>
             
*/
    
public   static  Date getEndOfDay(  final  Date pDate ){
        
       fCalendar.setTime( pDate );
       
try {
           fCalendar.set( Calendar.HOUR_OF_DAY, 
23  );
           fCalendar.set( Calendar.MINUTE, 
59  );
           fCalendar.set( Calendar.SECOND, 
59  );
        }
catch (ArrayIndexOutOfBoundsException ex){
            ex.printStackTrace();
        }
        
return  fCalendar.getTime();
    }





你可能感兴趣的:(Java 返回原值的引用还是拷贝的引用)