Java中參數傳遞問題(基本類型、引用類型、String)

package com.xzq;

/**
 * @program: java8_demo
 * @description: java中傳值和傳引用
 * @author: XZQ
 * @create: 2020-01-10 18:51
 **/
public class TestTransferValue {

    public void chanageValue1(int age) {
        age = 20;
    }

    public void chanageValue2(Person person) {
        person.setName("張飛");
    }

    public void chanageValue3(String str) {
        str = "abc";
    }

    public static void main(String[] args) {
        TestTransferValue testTransferValue = new TestTransferValue();
        int age = 10;
        testTransferValue.chanageValue1(age);
        System.out.println(age);
        System.out.println("-----------------------------------");

        Person person = new Person();
        person.setName("宋江");
        testTransferValue.chanageValue2(person);
        System.out.println(person.getName());
        System.out.println("-----------------------------------");

        String str = "xxx";
        testTransferValue.chanageValue3(str);
        System.out.println(str);
    }
}

class Person {
    private String name;

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

    public String getName() {
        return name;
    }
}

 

運行結果:

10
-----------------------------------
張飛
-----------------------------------
xxx

一、

對於changeValue1,屬於傳值,將age複製一份傳給changeValue1。

但是輸出依然是main方法中的age,作用域不同。

如圖所示,changeValue1中的age並沒有和main方法中的三個age一樣高亮顯示。

二、

對於changeValue2,屬於傳引用類型,是將引用(內存地址)傳遞給changeValue2;

如圖所示,空心箭頭代表Main線程的,實心箭頭代表changeValue2的。

三、

這題很坑,對於changeValue3,也是傳引用類型,而與Person不同的是,String是字符串是一個特殊的數據類型,它的底層是一個final 型的ch[]數組,屬於無法更改,所以字符串在作爲參數傳遞時,可以當做一個特殊的數組進行操作,同樣的它也是將複製一份原本的對象引用給了副本,此時副本對象的引用和原本對象的引用都指向原始字符串的位置,也就是str和在剛開始初始化時它指向的地址和原對象str(main中)指向的位置一致,即str的初始hashcode值和原對象str(main中)的hashcode值一樣,str經過str=“abc”操作後,由於字符串的不可變性,此時會str一個新的對象引用,即此時str指向“abc”的位置。str的hashcode值會變化,但是原本str(main中)它的對象引用沒有發生改變,並且“xxx”也未發生改變,所以str(main中)任然指向”xxx”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章