Java类中返回引用对象之后导致类中数据被修改的情况
作者:互联网
package Learning;
import java.util.Date;
public class ClassDemo {
private String sss;
private Date d;
public ClassDemo(String sss) {
this.sss = sss;
}
public String getSss() {
return sss;
}
public ClassDemo(String sss, Date d) {
this.sss = sss;
this.d = d;
}
public Date getD() {
return d;
}
public static void main(String[] args) {
ClassDemo c=new ClassDemo("asd",new Date());
System.out.println(c.d);
Date s=c.getD();
s.setTime(1212123123);
System.out.println(c.d);
}
}
根据上图可以发现对象中的数据被修改了,但是代码中并没有修改器方法,只有访问器方法,那么问题出在了哪里?
由于getD返回的方法是一个引用可变对象,这导致了类外部的一个Date类也拥有了管理类内部数据的渠道,也就是这个外部的Date类指向了类内部的成员,而这时对内外部的数据进行修改也会同时修改类内部的数据,因此请不要编写返回引用可变对象的访问器方法。
当然,如果一定要返回一个可变对象的引用,那么应该先对它进行克隆,对象clone是指存放在另一个位置上的对象副本。
修改后的getD代码如下:
public Date getD() {
return (Date)d.clone();
}
可以发现修改外部Date对象并没有导致类内对象的数据被修改。
标签:Java,String,getD,ClassDemo,sss,引用,Date,public,类中 来源: https://blog.csdn.net/Zhangsama1/article/details/122136416