基本类型赋值和普通对象赋值的不同

 对象赋值是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指向同一个内存,这样最后的值就交换了。

总结:基本类型的变量值小,可直接拷贝;对象包含多个值,不容易复制,赋值采用共享同一块内存区域,即指针指向同一内存区域,函数里的局部变量编译器不会给默认值,需要自己初始化,不然会报错,类的成员变量,编译器会给默认值,可以直接使用。

猜你喜欢

转载自blog.csdn.net/qq_41404557/article/details/88199740
0条评论
添加一条新回复