Java值傳遞和引用傳遞


1、基本類型和引用類型

Java中數據類型分為基本類型的引用類型兩大類

基本類型: byte、short、int、long、float、double、boolean、char
引用類型: 類、接口、數組

基本類型的變量在聲明時就會分配數據空間
而引用類型在聲明時只是給變量分配了引用空間,並不分配數據空間

2、值傳遞和引用傳遞

### 值傳遞 方法調用時,實際參數把它的值傳遞給方法的形參,形參接收的只是原始值的一個副本,后續方法里對形參的修改不會影響原來的實參的值

引用傳遞

引用傳遞在方法調用時,傳遞給方法形參的只是原始值的一個引用,這個引用指向變量實際的值,當方法里對引用的值修改時,由於修改的是內存地址的值,所以原始值也會受影響

3、示例

``` public class TestTransferValue {
public void changeInt(int age) {
	age = 30;
}

public void changeValue(Person person){
	person.setName("xxx");
}

public void changeString(String str){
	str = "xxx";
}

public void changeInteger(Integer i){
	i = 30;
}

public void changeFloat(Float i){
	i = 30f;
}

public void changeDouble(Double i){
	i = 30d;
}

public void changeBigDecimal(BigDecimal i){
	i = new BigDecimal(30);
}

public static void main(String[] args) {
	TestTransferValue test = new TestTransferValue();
	int age = 20;
	test.changeInt(age);
	System.out.println("int =" + age);
	
	Person person = new Person("abc");
	test.changeValue(person);
	System.out.println("person name=" + person.getName());
	
	String str = "abc";
	test.changeString(str);
	System.out.println("string=" + str);
	
	Integer i = 20;
	test.changeInteger(i);
	System.out.println("Integer=" + i);
	
	Float f = 20f;
	test.changeFloat(f);
	System.out.println("Float=" + f);
	
	Double d = 20d;
	test.changeDouble(d);
	System.out.println("Double=" + d);
	
	BigDecimal b = new BigDecimal(20);
	test.changeBigDecimal(b);
	System.out.println("BigDecimal=" + b);
	
}

}

class Person implements Serializable{
private String name;

public Person(String name) {
	this.name = name;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

}


輸出結果:

int =20
person name=xxx
string=abc
Integer=20
Float=20.0
Double=20.0
BigDecimal=20


可以看到,int、Integer、Double、Float、BigDecimal 、String類型的值都沒有發生改變  
這里要說一下String類型,由於String是不可變類型,執行str = "xxx"這一句時,實際上是在常量池中新產生了一個xxx對象(如果常量池里之前沒有xxx這個對象),所以形參的實際值變成了xxx,而原來的實參值還是abc

<h1>4、總結</h1>
> 1、基本數據類型傳值,對形參的修改不會影響實參
> 2、引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象
> 3、String, Integer, Double等不可變的類型,可以理解為傳值,最后的操作不會修改實參對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM