• Java基础——值传递


    值传递?

    参数传递的值的拷贝,改变拷贝不影响原参数。

    引用传递?

    参数传递的是参数本身,改变形参,实参也改变。

    Java中是什么传递?

    Java中只有值传递

    实际情况为什么不对呢?

      1. 基本数据类型

      

     1 public class Main {
     2 
     3 
     4     void method01(int a ){
     5         a++;
     6         System.out.println("a in method01 is "+a);
     7     }
     8 
     9     public static void main(String[] args) {
    10        Main main = new Main();
    11        int a = 12;
    12        
    13        main.method01(a);
    14        System.out.println(a);
    15 
    16 
    17     }
    18 }

    输出结果:

    a in method01 is 13
    12

    没有问题,原值没有改变。

      2. String类型

     1 public class Main {
     2 
     3     void method02(String s){
     4         s = "world";
     5         System.out.println("string in method is "+s);
     6    
     7     }
     8 
     9 
    10     public static void main(String[] args) {
    11        Main main = new Main();
    12    
    13        String s = "hello";
    14 
    15        main.method02(s);
    16        System.out.println(s);
    17 
    18 
    19     }
    20 }

    输出结果:

    string in method is world
    hello

    没有问题,是值传递。原值没有改变

      3. 自定义类

    public class Main {
        void method03(Cat cat){
            cat.setName("haha");
            System.out.println("cats name is "+cat.getName());
        }
    
        public static void main(String[] args) {
           Main main = new Main();
    
            Cat cat = new Cat();
            cat.setName("mimi");
            main.method03(cat);
            System.out.println("cats name in main is "+cat.getName());
    
        }
    }
    class Cat{
        String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }

    输出结果:

    cats name is haha
    cats name in main is haha

    不对!为什么值传递原值改变了??????

    注意了,这里虽然原值改变了,但是还是值传递。为什么呢?

    因为传递的是参数的引用的拷贝也是值传递,这里的值指的是地址的拷贝。

    这里举一个简单的例子(引用地址:https://www.cnblogs.com/wchxj/p/8729503.html

    值传递:你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

    引用传递:你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

    当你使用值传递,拷贝一份钥匙给你朋友后,你朋友在你家砸了电视,那么你回家的时候电视肯定是被砸了的。

    这个例子理解起来就容易多了。按照这个逻辑我们来测验一下。

    如果Java传递的只是引用的拷贝的话,我们将形参指向null,那么实参不会受到影响。通过上面的例子来解释就是,如果你给你朋友的钥匙只是一把复制的钥匙的话,我们将朋友手上的钥匙摧毁,我们还是能通过钥匙原件开门。

    public class Main {
    
        void method04(Cat cat){
        //摧毁朋友手中的钥匙 cat
    = null; try { System.out.println(cat.getName()); }catch (Exception e){ e.printStackTrace(); System.out.println("cat 已经被回收!"); } } public static void main(String[] args) { Main main = new Main(); Cat cat = new Cat(); cat.setName("mimi"); main.method04(cat); System.out.println(cat.getName()); } } class Cat{ String name; public void setName(String name) { this.name = name; } public String getName() { return name; }

    输出结果:

    java.lang.NullPointerException
    at Main.method04(Main.java:21)
    at Main.main(Main.java:44)
    cat 已经被回收!
    new name

    没错!就是这样。

    所以Java中只有值传递。

  • 相关阅读:
    slf4j+log4j的使用
    <context:component-scan>详解
    Spring装配Bean---使用xml配置
    Spring应用上下文中Bean的生命周期
    bootstrap table 复选框选中后,翻页之后保留先前选中数据
    前后端分离的时代,如何解决前后端接口联调问题?
    利用vue-cli搭建vue项目
    vue之注册自定义的全局js函数
    小程序之图片上传
    微信小程序-蓝牙连接
  • 原文地址:https://www.cnblogs.com/liziweiblog/p/11079164.html
Copyright © 2020-2023  润新知