java值传递的小题,路过的萌新可以看下,全部都是值传递

发布于:2022-12-26 ⋅ 阅读:(342) ⋅ 点赞:(0)

这个关于java值传递的demo

今天遇到一个问题,给大家分享下,也是自己一直困惑的一个点
Java的值传递

class E{
    String str = new String("good");
    char[] ch = {'a', 'b', 'c'};

    public static void main(String[] args) {
        E e = new E();
        e.change(e.str, e.ch);
        System.out.println(e.str );
        System.out.println(e.ch);
    }

    public void change(String str, char[] ch){
        str = "test ok";
        ch[0] = 'g';
    }
}
        System.out.println("我认为是 test ok 和 g b c");

在这里插入图片描述
一开始的想法

        // String 是包装类,是引用传递, e的str被修改,并不会影响其值
        // char作为基本类型, 一定会被修改,因为一直指向其本地
  • 值传递:在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
  • 引用传递:在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;

改正:

 String 类型的传递是引用传递,也即是地址传递。
 因为在Java里,String是对象类型,作为参数肯定是引用传递。

之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那java中,包装类的一个特质就是值操作时体现对应的基本类型的特质。

当写一个函数传递数组时,不要直接对内部成员赋值,否则结果就不可控了, 比如下面这个函数,如果myArray被某个成员函数改变了,那么传递的这个数组也会改变。

基本类型Demo

    public void changeInt(int a){
        System.out.println("change" + a);
        a = 3;
    }

    public static void main(String[] args) {
        E e = new E();
        int a = 1;
        e.changeInt(a);
        System.out.println("Main" + a);
    }

同一个地址
这里就是值传递,不会影响到原来的实际参数

在这里插入图片描述

    public void changeInt(int[] a){
        System.out.println("change path" + a);
        System.out.println("change" + Arrays.toString(a));
        a[0] = 3;
    }

    public static void main(String[] args) {
        E e = new E();
        int[] a = {1,1,1};
        e.changeInt(a);
        System.out.println("change path" + a);
        System.out.println("Main " + Arrays.toString(a));
    }

同一个地址
在这里插入图片描述

包装类型Demo

    public void changeInt(Integer a){
        System.out.println("change" + a);
        a = 3;
    }

    public static void main(String[] args) {
        E e = new E();
        int a = 1;
        e.changeInt(a);
        System.out.println("Main" + a);
    }

在这里插入图片描述


    public void changeInt(Integer[] a){
        System.out.println("change path" + a);
        System.out.println("change" + Arrays.toString(a));
        a[0] = 3;
    }

    public static void main(String[] args) {
        E e = new E();
        Integer[] a = {1,1,1};
        e.changeInt(a);
        System.out.println("change path" + a);
        System.out.println("Main " + Arrays.toString(a));
    }

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到