java的方法执行是否会改变外部传入对象的值(引用传递和值传递),这里为了老玩家方便,直接总结结论

常用总结是否会影响外部变量的值

基本变量类型

  • 比如int,short,long,double,float,boolean,char ,byte 都不会被影响,都是值传递

非基本变量类型

  • Interger,Short,Long,String,Double,Float,Boolean,Character,Byte 都不会被影响。这些虽然是类,但是被特殊处理过,所以不会被影响。
  • 自定义类型会被影响,传入的是引用,会改变外部变量的值。
  • List,Map,Set 常用的类都会被影响,会改变外部变量的值。

自定义对象中的变量类型

  • 比如Student中的name(类型为String),通过get方法取出,并对取出的对象修改。并不会修改student对象中的值。如果student类中有一个class(自定义对象),通过get方法取出并对其修改,则会影响student中的class对象的值。
  • 总结如果自定义对象中的属性是基本变量类型(包括衍生类和String),通过get方式取出,则不会影响原对象。如果是非基本变量类型,则会影响原对象。

代码

主干代码Main方法

package com.test.ljj;

public class MethodExplore {

    public static void swap(String a,String b){
        String temp=a;
        a=b;
        b=temp;
    }
    public static void swap(Integer a,Integer b){
        Integer temp=a;
        a=b;
        b=temp;
    }

    public static void swap(Student student01,Student student02){

        Student temp=new Student(student01);
        student01.setName(student02.getName());
        student01.setAge(student02.getAge());
        student02.setName(temp.getName());
        student02.setAge(temp.getAge());

    }

    public static void main(String[] args) {
        String a="fujian";
        String b="beijing";
        swap(a,b);
        System.out.println(a);
        System.out.println(b);

        Integer c=1;
        Integer d=2;
        swap(c,d);
        System.out.println(c);
        System.out.println(d);

        Student student1=new Student("apple",2);
        Student student2=new Student("balance",3);

        swap(student1,student2);
        System.out.println(student1);
        System.out.println(student2);

    }


}

非主干代码

  • Student 类
package com.test.ljj;

public class Student {



    private String name;
    private Integer age;


    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Student(Student student) {
        this.name = student.getName();
        this.age = student.getAge();
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

作者部分执行结果

在这里插入图片描述

一问一答

  • List<Student> 对象,从list中取出一个Student类型的对象,会是值传递还是引用传递?

    引用传递

  • List<Student> list1 中调用add方法添加一个对象a,List<Student> list2 中也调用add方法对象添加一个对象a,修改list1中的a对象,是否会改变list2中a对象的值?

    会修改list2中的值,因为是引用传递,指向的student对象都是同一地址,所以修改了一个,将会使他们都被修改。

补充

  • Intger虽然有-127~127的缓冲池,但是哪怕用1000,2000的数据进行测试,方法内依旧不是引用的关系,而是新建了一个对象。所以不会影响外部变量的值。

参考文档

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值