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



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值