在core java中看到这样一道例题,如下:class Test{
public Date getHireDay(){
return hireDay;
}
private Date hireDay;
}书中提到:不要编写返回引用可变对象的访问器方法
应更改为如下:class Test{
public Date getHireDay(){
return (Date)hireDay.clone();
}
private Date hireDay;
}我想问的是,什么是可变对象?
不可变对象是指final类的实例,如String ,Integer这些。
可变对象是是那些没有使用final修饰的类的实例.
不知我这么理解是否正确?
如果不是,那么我们将进行程序设计时该如何判断该对象是否为可变对象或不可变对象?
public Date getHireDay(){
return hireDay;
}
private Date hireDay;
}书中提到:不要编写返回引用可变对象的访问器方法
应更改为如下:class Test{
public Date getHireDay(){
return (Date)hireDay.clone();
}
private Date hireDay;
}我想问的是,什么是可变对象?
不可变对象是指final类的实例,如String ,Integer这些。
可变对象是是那些没有使用final修饰的类的实例.
不知我这么理解是否正确?
如果不是,那么我们将进行程序设计时该如何判断该对象是否为可变对象或不可变对象?
解决方案 »
- 从小题目看大问题(求各种探讨)
- Java 运行不了,出现"Error: could not find java.dll" 怎么解决?
- 怎么把String类型的转换成XMLGregorianCalendar
- System.out.println的问题
- 紧急!~请教高手 @@@@@@
- Java Tutorial的安全管理器中的一个问题
- 我写拉个数据库更新的程序以下是其中的一点主要部分,可是运行后显示update语法错误,请大家帮我看看,谢谢
- 请教高手一个“io流”的“文件写入读出”的问题....
- java 怎么监听进程
- 内容是String[]的Object用什么最简单办法转变回String[]
- 父类的静态方法能被子类覆盖吗?
- 遍历list元素,用iterator() ,再while(hasNext()),next()有什么好处吗
Test t=new Test();
Date d=t.getHireDay()//假如期望得到的是2008-06-16
// other...
setXXX(t)//在此方法里调用了t.setHireDay方法,改变了其值,那么上面的d就出现我们不想要的结果,
如果我们返回的是hireDay的一个克隆,那么就不会出现值被改的情况了,因为这个克隆的对象没有引用(句柄)无法对他进行修改。
但是我们有时想用setXXX(t)去改变我们的hireDay,而且这也是我们所期望的,那么我们就不能用clone。所以说因事而定。
因为除了基础对象 String,int,boolea,double,float,shot,char,byte....
是使用值传递的
就是说,这些对象在另外一个方法中被调用时,不会改变他们本身的值,改变的只是他们引用的一个副本但是,其他所有的实例对象都是使用引用传递的
当你把一个对象通过一个GET方法传递出去以后,在外部可以通过这个引用对象上的方法来改变他对象中属性的值举个例子public class myint{
public int i = 0;
}
public class test {
int i = 0;
myint Obj_i = new myint(); public int getI(){ return i;}
public myint getMyInt(){ return Obj_i;}
}
public class test2 {
public static void main(String[] args) {
test t = new test();
int i = t.getI();
myint Obj_i = t.getMyInt(); // 尝试改变i 和obj_i的值
i = 10;
Obj_i.i = 20; //显示test上原本的属性
System.out.println(t.i); // 输出仍然是0 test上的i并没有被改变
System.out.println(t.getMyInt().i); // 输出是20 test上的Obj_i.i的值被改变了
}
}
不能在别的类中修改本类的私有域,但是别的类调用本类修改器就可以修改。
然而上面的可变对象没有调用本类的修改器就能修改本类的私有域,这就破环了封装。可变对象就是基本数据类型对象和不可变类对象(类中没有修改器改变其对象的类,例如String类)以外的对象。