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等不可變的類型,可以理解為傳值,最后的操作不會修改實參對象
