Java 参数传递分析

前言

再讲Java参数传递分析之前先给大家看段代码,想想代码输出结果是啥呀!

  public static void main(String[] args) {
      String str=" I am Jack";
      changeStr(str);
      System.out.println("mian方法中值: "+str);
    
   }
  public static void changeStr(String str){
      str="I am Tom";
      System.out.println("changStr方法():"+str);
      
  }

看完之后 大家心中应该有答案了吧!给出答案后!不知道大家想的和实际输出的是否有出入了!大家请看!

Java 参数传递分析_第1张图片
Paste_Image.png

看到答案后大家是否有点疑惑,我明明调用changStr()方法了, 为啥在 main方法中 Str 的值还是 “ I am Jack”? 说到这 就开始进入我今天所要讲的主题Java参数分析,先看看Java 基本类型参数分析!

基本类型传递

整数:byte,short, int ,long
浮点型 :float double
逻辑型 :boolean
字符型 :char
这四类八种类型 都是值传递,因为值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了

  public static void main(String[] args) {
     int  num=3;
     changeNum(num);
     System.out.println("num:"+num);//输出结果3
    
   }
  public static void changeNum(int newNum){
      newNum=5;
     System.out.println("newNum:"+newNum);//输出结果5
      
  }
Java 参数传递分析_第2张图片
Paste_Image.png

这些改变都是在changNum()方法中 ,并不影响外面的值 ,这样就可以解释输出结果!

Java 对象传递

这也是我们开发中经常遇到的 理解好对我们开发很有帮助,废话不多说直接上代码

例一

简单实体类

public class Student {
    private String name;
    private String address;

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

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

Test类

  public static void main(String[] args) {
    Student stu=new Student("jack","广东广州");
    changeStudent(stu);
    System.out.println("main() "+stu.getName());
    
   }
  public static void changeStudent(Student changeStu){
    changeStu.setName("Tom");
    System.out.println("changeStudent() "+changeStu.getName());
      
  }

大家思考下 这个输出结果是啥了!如果按照基本类型去思考 你就掉坑了,哈哈哈,给大家看下答案吧!

Paste_Image.png

对改变成功了 两次输出都是Tom 而不是按照基本数据类型传递 看起来现在给大家分析下吧!

Java 参数传递分析_第3张图片
Paste_Image.png

可以明确看出stu,changStu 指向同堆空间 意思 在changeStudent()方法中操作也就是同堆空间,这样的话不管是在changeStudent() 输出还是 在这个方法外输出 改变仍然有效。

例二

 public static void main(String[] args) {
   Student stu=new Student("jack","广东广州");
   changeStudent(stu);
   System.out.println("main() "+stu.getName());
   
  }
 public static void changeStudent(Student changestu){
     changestu=new Student("Tom", "广东广州");
   System.out.println("changeStudent() "+changestu.getName());
     
 }

这个输出结果大家再想想是啥! 现在我就来公布答案,请看!

Paste_Image.png

是不是又有迷惑了,看下分析图

Java 参数传递分析_第4张图片
Paste_Image.png

例三

直接上代码吧!

 public static void main(String[] args) {
    Student stu=new Student("jack","广东广州");
    changeStudent(stu);
    System.out.println("main() "+stu.getName());
    
   }
  public static void changeStudent(Student changestu){
      changestu.setName("scott");
      changestu=new Student("Tom", "广东广州");
      System.out.println("changeStudent() "+changestu.getName());
      
  }

我想大家通过上面分析输出结果,已经知道了但是 我还是分析呀!加深印象
结果是

Java 参数传递分析_第5张图片
Paste_Image.png

分析图

Java 参数传递分析_第6张图片
Paste_Image.png

现在回到 开篇说问题,我相信大家都可以很好的解释了 他的输出结果了
因为String对象具有不可变性,所以针对操作str = "I am Tom"
,在String池中不存在的时候,就是相当于str = new String()
,这样变化下的话,那么就和例二具体图一样,所以就不画了,希望对你有帮助.

总结

1,对于基本类型,直接拷贝值传递过去
2,对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.

在最后 我想给大家看段代码 ,看看它的输出结果是什么?

  public static void main(String[] args) {
    String str=null;
    str+="I am Jack";
    System.out.println("str=== "+str);
}

请在评论中说出你的答案和理由,这是我在项目中的发现一个有趣的东西,想和大家分享下!随便看下和我的理解是否一样 。

你可能感兴趣的:(Java 参数传递分析)