Java 参数传递分析

作者: 小萌杰 | 来源:发表于2017-01-03 17:30 被阅读269次

    前言

    再讲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 参数传递分析

        本文链接:https://www.haomeiwen.com/subject/mmigvttx.html