java传值与传引用问题总结

1.基本类型与引用类型区别
对于基本类型(int , long , short , double , char , byte , float , boolean ),变量直接保存数据的值;
对于引用类型,变量保存的是对象的地址,由此地址指向实际对象。如图:

int a=10
String ss="hello world";

这里写图片描述

对于基本类型,直接传值,方法里进行重新赋值不会导致原值改变:

public class Test {
    public static void change(int n){
        n=10;
    }
    public static void main(String[] args) {
        int n = 0;
        change(n);
        System.out.println(n);
    }
}

输出:0

public class Test {
    public static void change(String n){
        n += "world";
    }
    public static void main(String[] args) {
        String n = "hello";
        change(n);
        System.out.println(n);
    }
}

输出:hello
String是引用类型,按理说应该方法中的值会改变原来的值,但是这里输出的是hello。因为String这种引用类型比较特殊,其实传入方法的是一个副本,不管方法内怎么改变String的值,都是使副本指向了这个string 值。
这里写图片描述
main方法内的n一开始指向的是hello这块数据,调用change方法时,传入的是n的一个副本,相当于重新new 一个String,所以对其的操作并不会对外面的n造成影响。

2.数组

public class Test {
    public static void change(char[] c, int[] ii) {
        c[0] = 'g';
        ii[0] = 8;
    }

    public static void main(String[] args) {
        char[] c = { 'a', 'b', 'c' }; // 数组
        int[] ii = { 1, 2, 3 };// 数组
        change(c,ii);
        System.out.println(c[0] + " " + ii[0]);

    }
}

输出:g 8
数组也是引用类型,传入的是引用,在方法内操作会改变原始值。

3.对于对象


public class Test {
    public static void change(Student s) {
        s.name = "lisi";
    }

    public static void main(String[] args) {
        Student s = new Student();
        s.name = "zhangsan";
        change(s);
        System.out.println(s.name);

    }
}

class Student {
    String name;
}

输出: lisi
对象是引用类型,会改变原始值~
再看个例子:


public class Test {
    public static void change(Student s) {
        s = new Student();
        s.name = "lisi";
    }

    public static void main(String[] args) {
        Student s = new Student();
        s.name = "zhangsan";
        change(s);
        System.out.println(s.name);

    }
}

class Student {
    String name;
}

输出: zhangsan
这个传入的虽然是引用类型,但方法内部改变了原对象的指向,方法内操作的相当于一个新的对象。所以不会改变原对象的属性。
这里写图片描述
传入时,方法内s 跟main方法内的s都是指向zhangsan,当change方法里面重新new 一个Student并赋值后,change方法里的s已经指向了一个新的对象,main方法里还是指向原来的对象,并不会因为change方法里的操作做任何改变。

最后一个:


public class Test {
    public static void change(Student s) {
        s = new Student();
        s.name = "lisi";
    }

    public static void main(String[] args) {
        Student s = new Student();
        s.name = "zhangsan";
        change(s);
        System.out.println(s.name);

    }
}

class Student {
    static String name;
}

输出: lisi
这个例子相比上个例子就是将Student的name属性变成了static,全局变量了,这样即使在change方法内重新new了一个对象,指向不同,也还是会改变这个属性的,道理很简单, 全局变量啊!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值