(Java核心技术基础知识(4) )----深入理解java的基本类型、引用类型以及传参问题

深入理解java的基本类型、引用类型以及传参问题

代码如下

Te类中

package com.test213;

public class Te {
	public String name;
	public int age;
}

Test类中

package com.test213;



public class Test {
		public static void main(String[] args) {
				Te a = new Te();
				Te b = a;
				a.name = "123";
				a.age = 90;
				int num = 100;
				Integer NUM = 100;
				change0(num);
				change0(a);
				change0(NUM);
				System.out.println(a.name);   //wbs
				System.out.println(a.age);    //99
				System.out.println(num);      //100
				System.out.println(NUM);      //100
			}
			public static void change0(Te a1) {	
				a1.name = "wbs";
				a1.age = 99;
			}
			public static void change0(int a1) {	
				a1 = 99;
			}
			public static void change0(Integer a1) {	
				a1 = 99;
			}
		}

输出结果

分析一下输出结果

第一个输出wbs,第二个输出99;

Te a = new Te();执行这句代码时,堆内存中分配空间给Te()类。同时a指向Te();

public static void change0(Te a1) {    
                a1.name = "wbs";
                a1.age = 99;
            }

传参时 将a中记录的地址传给了a1,此时a 和 a1指向的堆内存是同一块。

这时候改变a1.name,a1.age就相当于改变了a.name,a.age

扫描二维码关注公众号,回复: 5462749 查看本文章

第三个输出100,第四个输出100;两个不同的是 一个int类型一个integer类型。(int和Integer类型的值在经过函数调用之后值未被改变这是为什么呢?

1.int:

大家都知道,java有八个基本类型,int就是其中的一类;在传参的时候,基本类型的参数都是深复制,也就是说在函数里被改变值的变量不是原来的变量num,而是经过深复制的a1,在函数结束时,a1被释放,从头到尾,原变量num都没有被改变过,所以输出num仍为原值100。


2.Integer:

Integer也是引用类型,但它的结果却和int一样。因为Integer的源码中对int变量的定义是final类型的,值是不能被改变的,而且在函数调用的装箱过程中,调用的是Integer的ValueOf()函数,在这个函数的源码中,返回值是new的一个新对象,所以Integer在传参的时候也是深复制。

对于类的交换问题

代码如下

package com.test213;



public class Test {
		public static void main(String[] args) {
	
					Te aa = new Te();
					aa.age = 100;	
					Te bb = new Te();
					bb.age = 60;	
					change(aa,bb);	
					System.out.println(aa.age);
					System.out.println(bb.age);
			        change2(aa,bb);	
					System.out.println(aa.age);
					System.out.println(bb.age);
				}
				public static void change(Te a1,Te b1) {	
					Te temp;
					temp = a1;
					a1 = b1;
					b1 = temp;
					
				}
				public static void change2(Te a1,Te b1) {
					
					Te temp = new Te();
					temp.age = a1.age;
					a1.age = b1.age;
					b1.age = temp.age;
					
				}
			}

public static void change(Te a1,Te b1) {    
                    Te temp;
                    temp = a1;
                    a1 = b1;
                    b1 = temp;
                    
                }执行这句是图如下 aa,bb指向不会变

public static void change2(Te a1,Te b1) {
                    
                    Te temp = new Te();
                    temp.age = a1.age;
                    a1.age = b1.age;
                    b1.age = temp.age;
                    
                }

这才是真正实现交换的代码

猜你喜欢

转载自blog.csdn.net/wbs925zxh/article/details/87743340