对象赋值是Reference(参考)赋值,而基本类型是直接值得拷贝。
package qwer;
public class asdf {
public static void main(String[] args) {
class MyNumber
{
int num=5;
}
int num1=5;
int num2=num1;
System.out.println("num1:" + num1 + ", num2:" + num2);
num2=10;
System.out.println("num1:" + num1 + ", num2:" + num2);
MyNumber obj1=new MyNumber();
MyNumber obj2=new MyNumber();
System.out.println(obj1.num);
System.out.println(obj2.num);
System.out.println("======接下来输出新值=====");
obj2=obj1;
obj2.num=10;
System.out.println(obj1.num);
System.out.println(obj2.num);
}
}
先对num1赋值为5,然后赋值num2等于num1,这时候num2等于5,当num2赋值为10时,第二个输出num2为10,那num1为5。
因为num2等于num1时,num2指向一个5,num1另指向一个5,相当于拷贝过程,所以num2为10,num1为5.
定义了一个obj1和一个obj2,obj1指向一个5,obj2指向另一个5,obj1的指向赋给obj2,相当于obj2的指针指向的是和obj1的同一个地方,而之前obj2指向的那个5就没有指针指向了,当obj2赋值为10的时候,发现obj1赋值也为10了。
package qwer;
public class zxcv {
public static void main(String[] args) {
class MyNumber
{
int num=5;
}
int a=1,b=2;
swap(a,b);
System.out.println("a is :" + a + ", b is :" + b);
MyNumber obj1=new MyNumber();
MyNumber obj2=new MyNumber();
obj2.num=10;
swap(obj1,obj2);
System.out.println("obj1 is :" + obj1.num + ", obj2 is :" + obj2.num);
}
public static void swap(int m,int n)
{
int s=m;
m=n;
n=s;
}
public static void swap(MyNumber obj3,MyNumber obj4)
{
int s=obj3.num;
obj3.num=obj4.num;
obj4.num=s;
}
}
第一个交换程序:没有达到效果,因为swap函数的形参是int型,int型是直接赋值的,相当于a=1,b=2,m=1,n=2,函数运行后a=1,b=2,m=2,n=1,只是m,n的值相互换了,但是a,b的值没有改。
第二个交换程序:达到了效果。因为对象是比较庞大的,赋值是直接赋指针的,传过去的就是obj1=obj3,obj2=obj4,即obj1和obj3指向同一块内存,obj2和obj4指向同一个内存,这样最后的值就交换了。
总结:基本类型的变量值小,可直接拷贝;对象包含多个值,不容易复制,赋值采用共享同一块内存区域,即指针指向同一内存区域,函数里的局部变量编译器不会给默认值,需要自己初始化,不然会报错,类的成员变量,编译器会给默认值,可以直接使用。