(看这一篇就够了)基本数据类型的赋值与引用类型赋值的区别

总结:
基本类型的变量值小,可直接拷贝;
对象包含多个值,不容易复制,赋值采用共享同一块内存区域。


基本类型示例:

public class Test{
    public static void main(String[] args){
        int a = 5;//基本数据类型的赋值过程就是值拷贝的过程,将5这个值拷贝给a
        int b = 0;//同理,将0这个值拷贝给a
        b = a;//执行这一步时,将a的值拷贝给了b,b此时的值就是5
        b = 6;//将6这个值拷贝给了b
        System.out.println("a:" + a);//输出 a:5
        System.out.println("b:" + b);//输出 b:6
    }
}

从上面可以看出,修改 a或者b的值时,另一个变量的值不会受到任何影响


引用类型示例:

/**
 * 实体类(引用类型)
 */
public class User{
    public int age;//int默认值为0
}
public class Test{
    public static void main(String[] args){
        User u1 = new User();//u1的引用指向u1的引用
        User u2 = new User();//u2的引用指向u2的引用
        u1.age = 20;
        u2 = u1;//将u2的引用指向u1的引用,即 u2和u1共享同一个内存区域中的数据
        System.out.println("u1的age:" + u1.age);//输出 u1的age:20
        System.out.println("u2的age:" + u2.age);//输出 u2的age:20
        u2.age = 30;
        System.out.println("u1的age:" + u1.age);//输出 u1的age:30
        System.out.println("u2的age:" + u2.age);//输出 u2的age:30
    }
}

从上面可以看出,修改 u1.age或者u2.age的值时,另一个变量的值也会一起变化,因为它们所指向的数据是同一份数据


因为前面讲到基本数据类型和引用数据类型存储的方式不同(详见开头总结),所以因此在对数据进行修改时也会有不同

public class Test {
    public static void main(String[] args) {
        String name = "张三";
        int age = 8;
        String[] su = new String[]{"语文", "数学", "英语"};
        Student stu1 = new Student(age, name, su);

        /*
        *   测试代码
        *   int是基本数据类型
        *   String是比较特殊的引用数据类型
        *   []数组是引用数据类型
        * */
        System.out.println("修改前输出");
        System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));
        //直接调用方法修改数据
        stu1.直接修改基本数据类型(age);
        stu1.直接修改引用数据类型(name);
        stu1.直接修改引用数据类型2(su);
        System.out.println("修改后输出");
        System.out.println(age+"\t"+name+"\t"+ Arrays.toString(su));

        System.out.println();

        System.out.println("修改前输出");
        System.out.println(stu1.toString());
        //传入引用数据类型修改
        stu1.修改引用数据中的基本数据类型(stu1);
        stu1.修改引用数据中的引用数据类型(stu1);
        stu1.修改引用数据中的引用数据类型2(stu1);
        System.out.println("修改后输出");
        System.out.println(stu1.toString());
    }
}

class Student {
    //基本数据类型
    int age;
    //引用数据类型
    String name;
    //引用数据类型2
    String[] subject;

    public Student(){}

    public Student(int age, String name, String[] subject) {
        this.age = age;
        this.name = name;
        this.subject = subject;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", subject=" + Arrays.toString(subject) +
                '}';
    }

    public void 直接修改基本数据类型(int age) {
        age++;
    }

    public void 直接修改引用数据类型(String name) {
        name += "已修改";
    }

    public void 直接修改引用数据类型2(String[] su) {
        su[0] = "已修改";
    }

    public void 修改引用数据中的基本数据类型(Student stu) {
        stu.age += 2;
    }

    public void 修改引用数据中的引用数据类型(Student stu) {
        stu.name += "已修改2";
    }

    public void 修改引用数据中的引用数据类型2(Student stu) {
        stu.subject[0]="已修改";
    }
}

 输出结果


 总结 :

( 一 ) int作为基本数据类型,是直接把一个值传进方法体进行修改,

而String虽然是引用数据类型,但是因为其特殊性质,也有int这种基本数据类型直接把值拷贝一份传入的特性,

而 [ ] 数组作为正常的引用数据类型,很明显就是把存储值的地址值传入方法进行操作,进而在修改后影响了外部的数据值

(二) 后用 Student对象  存储基本数据类型和特殊的String引用数据类型和正常的 [ ] 数组引用类型,然后进行修改其值,可以发现在外部调用的值都是修改后的结果,因为对象也是引用数据类型,把存储值的地址值传入方法,而方法根据地址值修改后,在外部调用的依旧是地址值链接的值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾欲乘风归去,又恐琼楼玉宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值