值传递和引用传递总结

值传递和引用传递总结

<!--[if !supportLists]-->1.<!--[endif]-->基本数据类型 

JAVA有八种数据类型,包括:

字符型 char     1字节

浮点型float 4字节

double    8字节

整型  short 2字节

int 4字节

long  8字节

布尔型 boolean  只有falsetrue,并不能用0和非零数来代替falsetrue

在这里要注意的是String并不是基本的数据类型,而是一个类,注意不要将String写成string

下面是对基本数据类型和String存放地址的描述:基本数据类型是存放在栈上,而String类型的话,是在栈上开辟一个空间,在堆上存放内容,然后返回给栈上空间一个地址。

String str1=abc;

String str2=str1;

尽管内容是一样的,但实际上已经为str2在堆上再开辟了一个新的存储空间。

<!--[if !supportLists]-->2.<!--[endif]-->值传递和引用传递

首先,让我们来看一段代码,通过分析输出结果来引出今天的问题。

 

 

public class Manager {

public static void main(String[] args) {

	int number1=1;
	System.out.println("number是"+number1);
        int number2=number1;
	System.out.println("number是"+number2);
	number2=2;
	System.out.println("number是"+number1);
	System.out.println("number是"+number2);

	Outman outman1=new Outman();
	outman1.set("张三",1000);
	outman1.show();
	Outman outman2=outman1;
	outman2.show();
	outman2.set("李四", 2000);
	outman2.show();
	outman1.show();
}
}

 

 

public class Outman {
        public String name;
        public int blood;
        public void set(String name,int blood){
	this.name=name;
	this.blood=blood;
}

public void show(){
	System.out.println("名字是"+name);	
        System.out.println("血量是"+blood);
}
}

 
值传递和引用传递总结
 

 

 

为什么第三、四次输出的number分别是12,而第三、四次输出的名字和血量全都变成1000,“李四”了呢?

这是因为,基本数据类型和String的传递是值传递。在这个例子中,相当于把number1的值1复制了一份之后传递给number2number2的值就是1,但接下来对number2再赋值时,只改变number2,而不改变number1

classinterfaceabstract class是引用传递。就是说outman1outman2共用同一个地址,因此改变其中任何一个都会影响到另外一个。

<!--EndFragment-->

你可能感兴趣的:(引用传递)