Java的参数传递

Javase

Posted by 丠 on July 11, 2020

Java中的参数传递

Java中没有真正的引用传递 只有值传递 传引用参数指的还是原来的那个引用,但是Java里面参数类型是对象时是复制了原来的引用到一块新的内存,两者之间没有关系

1按值传递

在方法调用时,传递的参数按值的拷贝传递

public class TempTest 
       {
        private void test1(int a)
        {
            a = 5;
            System.out.println("test1方法中的a="+a);
        }
        public static void main(String[] args) 
        {
            TempTest t = new TempTest();
            int a = 3;
            t.test1(a);  //传递后,test1方法对变量值的改变不影响这里的a
            System.out.println(”main方法中的a=”+a);
        }
    }


运行结果是: test1方法中的a=5 main方法中的a=3

按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

2按引用传递

在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

 public class TempTest 
    {
      private void test1(A a)
        {
        }
      public static void main(String[] args) 
        {
            TempTest t = new TempTest();
            A a = new A();
            t.test1(a); //这里传递的参数a就是按引用传递
        }
    }
    class A
    {
        public int age = 0;
    }


3按引用传递的重要特点

传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

    public class TempTest 
    {
        private void test1(A a)
        {
            a.age = 20;
            System.out.println("test1方法中的age="+a.age);
        }
        public static void main(String[] args) 
        {
            TempTest t = new TempTest();
            A a = new A();
            a.age = 10;
            t.test1(a);
            System.out.println(”main方法中的age=”+a.age);
        }
    }
    class A
    {
        public int age = 0;
    }

图解

UJtI2j.png

UJt5GQ.png

此时A实例的age值的变化是由test1方法引起的

运行结果如下: test1方法中的 age=20 main方法中的 age=20

对上述代码稍作改变

能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?

方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:

 public class TempTest {
        private void test1(A a){
            a = new A();//新加的一行
            a.age = 20;
            System.out.println("test1方法中的age="+a.age);
        }
        public static void main(String[] args) {
            TempTest t = new TempTest();
            A a = new A();
            a.age = 10;
            t.test1(a);
            System.out.println(”main方法中的age=”+a.age);
        }
    }
    class A{
        public int age = 0;
    }


图解

UJNleP.png

UJN1df.png

这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的

运行结果为: test1方法中的age=20 main方法中的age=10

以上就是两种参数传递,

需要注意的是,引用传参由于指向同一片内存空间

所以方法体中的参数有可能改变内存空间的数值

导致main方法中的参数同样改变

总结

(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;

版权声明:本文为CSDN博主「散仙一个」的原创文章