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”。

发布了24 篇原创文章 · 获赞 2 · 访问量 408

猜你喜欢

转载自blog.csdn.net/qq_42107430/article/details/103929407
今日推荐