看了三章的Pratical Java,复习一下…..
实践1:参数以by value方式传递而非by reference方式传递
如果你认为Java中的参数是以by reference方式传递的,那你就错了.参数都是以by value方式传递的.比如:我们新建一个类,类中有一个方法如下:
public static void modifyPoint(Point pt, int j ){} //当然里面会是修改该参数值的操作.后面有个main方法调用这个方法,实参分别为p 和 i.调用后会修改这两个参数的值吗?有一个会的.就是p.为什么?
因为当进行方法调用时,会将p 和i 值的副本传递给调用方法,当对p对象修改时,因为p是指向一个Point实例的引用,因而调用该方法,就会直接对Point对象属性进行修改.而i 值的副本修改后,和原先的i 是没有任何联系的.简而言之,Java 以by value方式传递了一个Object Reference
实践2: 对不变的data & object references 使用 final
看看这段代码:
class Circle {
private double rad;
public Circle( double r) {
rad = r;
}
public void setRadius(double r ) {
rad = r;
}
public double radius() {
return rad;
}
}
public class FinalTest {
private static final Circle wheel = new Circle( 5.0 );
public static void main( String args[] )
{
System.out.println(“Radius of wheel is ” +
wheel.radius() );
wheel.setRadius(7.4);
System.out.println(“Radius of wheel is now ” +
wheel.radius() );
}
}
是编译时候出错,还是会打印出: Radius of wheel is 5.0
Radius of wheel is now 7.4 ??
答案是第二个,为什么?我们已经将[b]final Circle wheel [/b]设置为final了啊?对,我们是设置了,但是我们这个操作并没有改变wheel的值啊,它依然是一个指向原先的对象,只是改变了wheel所指向对象的值罢了.当你要去改变一个定义为final的引用值时,编译器会报错的.比如你在main方法中加入一个wheel = new ClassName(); 编译器肯定报错,因为你试图更改一个final常量数据,使其指向另外的对象.
实践4: 在array & vectors 之间慎重选择
Vector的内部是array实现的.当新建一个vector,就会内建一个array.并以java.lang.object为其类别,用来管理将被存储于vector中的数据项.当vector增长时,其内部array就需要重新分配并进行拷贝.当有数据从vector移除,其底层array将被凑实.(compacted).如果未能适当运用vector,上述这些将会导致性能问题….
比较:
支持基本类别 支持对象 自动改变大小 速度快
array YES YES NO YES
vector NO YES YES NO
[align=right][size=1][color=#cccccc][Edit on 2004-4-29 23:43:32 By jfish][/color][/size][/align]


最新评论