环境
jdk:1.7
前言
今天在写程序
时,发现一个问题:
//发行结果公告日期
Date olissuePublishDate = o.getDate("olissue_publish_date");
isSpecialDate(olissuePublishDate);
map.put("olissue_publish_date", olissuePublishDate);
下面这个方法是:要是日期为1900-01-01
,就把其置为空。
/**
* 特殊判断处理
* @param issuePublishDate
* @return
* @author yutao
* @date 2017年12月29日下午1:25:48
*/
public static Date isSpecialDate(Date issuePublishDate) {
if(issuePublishDate == null){
return null;
}
if(DateUtil.compare(issuePublishDate, DateUtil.stringToDate("1900-01-01", "yyyy-MM-dd")) == 0){
issuePublishDate = null;
}
return issuePublishDate;
}
我是希望通过方法isSpecialDate
来改变外面olissuePublishDate
的值
结果发现并没与成功:
map.put("olissue_publish_date", olissuePublishDate);
得到的数据,还是1900-01-01
,而不是null
。
对象 – 引用传递
因为在我的记忆里,对象是按照引用传递的,所以在调用这个isSpecialDate(olissuePublishDate);
方法时,如果方法内部改变了对象,那么外部的也会得到改变。
网上查询资料后,才知道java
本质上只有按值传递
;
只有一种参数传递机制 – 按值传递
无论引用类型或基本类型,当作为参数传递给一个方法时,两种类型都是按值传递的。
按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
只不过,当把对象作为参数传递时,可以通过该副本引用改变该对象的的属性。
而我上面程序在方法里issuePublishDate = null;
这里已经对变量重新赋值了。此时的变量issuePublishDate
已经不再是参数传进来的那个引用啦!所以自然就不会影响外面的原值。
参考地址: