Java 参数传递分析

学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学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);

  }

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


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

  }

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 而不是按照基本数据类型传递 看起来现在给大家分析下吧!


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


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


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());

  }
`

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


Paste_Image.png


分析图


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的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java!

转载于:https://my.oschina.net/abcijkxyz/blog/851126

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值