整日都泡在项目中,某日却忽然发现原来有些基础的东西竟然忘记了,或根本就没有掌握。于是就抽时间来补充一下基础知识,闲暇之余,就把一些东西随手写了出来,其一是方便自己日后翻阅,其二是希望也能对路过此处的初学者给点帮助。
我们今天讨论java里原始类型(Primitive)的赋值与非原始类型赋值的区别。简单地说,原始对象的赋值是直接拷贝内容过去,比如,int a = 1; int b = 2; a=b,则把b的内容直接拷贝到a中,再对a进行操作,不会对b产生影响;而非原始类型赋值则拷贝的是对象的reference,比如,假设Number是一个类,Number a = new Number();Number b = new Number();a=b;这样的话,a指向一个对象,b指向另一个对象,a=b执行后,a和b都指向b曾指向的那个对象,此时操作a仍然可能会对b产生影响,因为她们同时指向同一个对象。并且a=b之后,a原来指向的那个对象则被垃圾回收器回收了。这中行为有一个名词,叫aliasing,即别名效应,但不是我们课题的重点,我们的重点是赋值。
下面是一个简单的Java应用程序,可以直接运行,此程序演示了非原始类型的变量的赋值。
package
com.china.thinking.datatype;

/** */
/**
* 此例说明对原始类型Primitive赋值和对合成类型赋值是不一样的
* 对原始类型赋值就直接拷贝值
* 而对合成类型赋值拷贝的是对象的reference
* @author China.Lee
* 2007-11-18
* 在这里我们只是探讨原始类型和非原始类型赋值时的不同
* 实际上,直接操作对象的成员变量是有违oo原则的
*/
public
class
NotPrimitive

...
{
private Number n1 = null;
private Number n2 = null;
public NotPrimitive()

...{
this.n1 = new Number();
this.n2 = new Number();
}
public static void main(String[] args)

...{
NotPrimitive np = new NotPrimitive();
np.n1.i = 9;
np.n2.i = 47;
System.out.println("<<<<<<<<<<打印开始>>>>>>>>");
System.out.println("n1.i:--->:" + np.n1.i);
System.out.println("n2.i:--->:" + np.n2.i);
System.out.println("-------------------------");
np.n1 = np.n2;
System.out.println("n1=n2-->n1.i:" + np.n1.i);
System.out.println("n1=n2-->n2.i:" + np.n2.i);
System.out.println("-------------------------");
np.n1.i = 27;
System.out.println("n1.i=27-->n1.i:" + np.n1.i);
System.out.println("n1.i=27-->n2.i:" + np.n2.i);
System.out.println("-------------------------");
np.aliasingTest(np.n1);
System.out.println("aliasingTest-->n1.i:" + np.n1.i);
System.out.println("aliasingTest-->n2.i:" + np.n2.i);
System.out.println("<<<<<<<<<打印结束>>>>>>>>>");
}
public void aliasingTest(Number n)

...{
n.i = 888888;
}
}

class
Number

...
{
int i;
}
我们今天讨论java里原始类型(Primitive)的赋值与非原始类型赋值的区别。简单地说,原始对象的赋值是直接拷贝内容过去,比如,int a = 1; int b = 2; a=b,则把b的内容直接拷贝到a中,再对a进行操作,不会对b产生影响;而非原始类型赋值则拷贝的是对象的reference,比如,假设Number是一个类,Number a = new Number();Number b = new Number();a=b;这样的话,a指向一个对象,b指向另一个对象,a=b执行后,a和b都指向b曾指向的那个对象,此时操作a仍然可能会对b产生影响,因为她们同时指向同一个对象。并且a=b之后,a原来指向的那个对象则被垃圾回收器回收了。这中行为有一个名词,叫aliasing,即别名效应,但不是我们课题的重点,我们的重点是赋值。
下面是一个简单的Java应用程序,可以直接运行,此程序演示了非原始类型的变量的赋值。




























































