vcao(胶泥) ,感谢,可否推荐一些阐述Java内部机制的书籍,我手头使用的一本deitel :java how to program 5th edition 的书,感觉泛泛而论,无法知其所以然,让人很不爽。上面所提的问题,我试过很多次了,却实存在形参的改变而导致了实参的改变的现象。还有我所提到的持有堆内存的对象可以用=赋值,引起我的注意的是因为在分配大量堆内存时,有时会抛出错误(Error Not Exception),而当我显式释放资源调用finalize()后,错误就没有了,我对于java感到非常困惑,望各位不吝赐教!
Java没有提供运算符重载的,个人觉得应该加上! 楼主有没有看过thinking in Java(Java编程思想)啊,应该仔细看看它啊.
class Person { private String name;//姓名 private String sex;//性别 public Person(String x, String y) {
this.name = x;
this.sex = y;
} public void setStatus(String x, String y) {
this.name = x;
this.sex = y; } public String toString() { return name + sex; }
public static void changeref(Person tmpx, Person tmpy) {
//交换tmpx和tmpy对象
Person swapref = tmpx;
tmpx = tmpy;
tmpy = swapref;
System.out.println("在方法中交换的结果: refa =" + tmpx.toString());
System.out.println("在方法中交换的结果: refb =" + tmpy.toString());
}
f(d1);
时,
实参d1和形参d引用同一个对象(应时上面创建的那个)1. 如果在f方法中有: d = new Date(另一个日期);
则d引用了新建对象,但是实参d1仍然引用原来对象,没有变化.2. 如果上一步没有,而只是d.XXX方法去修改其引用对象的域的值,由于d和d1引用同一对象,所以看起来d1也变化了.
//交换tmpx和tmpy对象
Person swapref = tmpx;
tmpx = tmpy;
tmpy = swapref;
System.out.println("在方法中交换的结果: refa =" + tmpx.toString());
System.out.println("在方法中交换的结果: refb =" + tmpy.toString());
}你可以这样理解,首先这里的tmpx,tmpy所指向的是外部的某个对象,而你这样交换无非是让这里的形参所指的对象改变而已。所说的“引用”指的是你可以对tmpx.setStatus("a","male");这样相当于你对外部的实参进行操作。
楼主有没有看过thinking in Java(Java编程思想)啊,应该仔细看看它啊.