1. 程式人生 > >java中值傳遞和引用傳遞以及String是屬於什麼傳遞?

java中值傳遞和引用傳遞以及String是屬於什麼傳遞?

目前網路中有很多資料講值傳遞和引用傳遞的文章,我查了許多,看得眼花繚亂,因此整理此篇文章來整理下思路和大家分享一下

在我看來不管是傳遞基本資料型別和引用資料型別,都是屬於值傳遞。只不過傳遞引用資料型別時,傳遞的是物件的地址,如Person p = new Person()時,把p作為引數傳遞時,傳遞的是p中儲存的new的Person的地址(網上很多人把這叫做引用傳遞),那麼在方法中對p的屬性進行操作時,原來的p物件的屬性也會跟著變化,到這裡相信大家都能夠明白。

有一個個例就是String,首先要明白的是String也是一個類,下面舉個例子對比一下:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class Chuandi {
    public static void main(String[] args){
       Person person = new Person("張三",26);
change(person);
System.out.println(person.toString());
}
    public static void change(Person p){
        p.setAge(17);
p.setName("hiram");
System.out.println(p);
}
}
class Person{
   public 
String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this
.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

上面是我們平時常用的對物件呼叫的處理

得到的結果為:

Person{name='hiram', age=17}
Person{name='hiram', age=17}



可見方法中對物件屬性的修改也改變了原有物件的屬性

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面我們對change方法做個修改,新增p = new Person();

public class Chuandi {
    public static void main(String[] args){
       Person person = new Person("張三",26);
change(person);
System.out.println(person.toString());
}
    public static void change(Person p){
        p = new Person();
p.setAge(17);
p.setName("hiram");
System.out.println(p);
}
}

得到結果為

Person{name='hiram', age=17}
Person{name='張三', age=26}


注意:可見在方法中對屬性的修改並沒有改變作為引數傳遞的物件的屬性,因為方法中p重新指向了一個新的Person()的地址,再對p的屬性做修改時,作為引數傳遞的Person物件的屬性並不會發生改變,這就是我們平常對String物件的操作方法,只不過我們只常用String的簡式宣告方法String str = "java",這就相當於String str = new String("java"),這是建立一個新的String的過程,不單單是賦值的過程。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面看String的例子

public class Chuandi {
    public static void main(String[] args){
       String str = "java";
change(str);
System.out.println(str);
}
    public static void change(String str){
        str = "web";//這裡相當於str = new String("web"),也就類似於上面的p = new Person();
System.out.println(str);
}
}
自然而然得到的結果不一樣了

web

java