关于JAVA是值传递仍是引用传递的问题

1.概念spa

  值传递:方法调用时,实际传入的是它的副本,在方法中对值的修改,不影响调用者的值。code

  引用传递:方法调用时,实际传入的是参数的实际内存地址,调用者和调用方法所操做的参数都指向同一内存地址,因此方法中操做会影响调用者。对象

2.问题blog

  ① 值传递传入的值,是它的副本是什么意思?内存

  

public static void main(String[] args) {
        int a = 0;
     testValue(a); System.out.println(a); }
public void testValue(int a) { a = 8; }

  打印结果: 0hash

      此处调用方法后,a的值依然没有变化。class

  

  ②当传入的值是一个对象时,也不会发生变化么?test

 

package com.test;

public class TestDemo {
    public static void main(String[] args) {
        TestDemo2 testDemo2 = new TestDemo2();
        System.out.println("调用前:" + testDemo2.hashCode());
        testValue(testDemo2);
        System.out.println("调用后:" + testDemo2.hashCode());
    }
    
    public static void testValue(TestDemo2 testDemo) {
        testDemo = new TestDemo2();
    }
}

class TestDemo2 {
    int age = 1;
}

 

  打印结果:引用

   调用前:366712642
   调用后:366712642方法

  这里能够看到testDemo2 的值依然没有变化,调用先后所指向的内存地址值是同样的。对传入地址值的改变并不会影响原来的参数。

  ③既然是值传递,为何参数是引用类型的时候,方法内对对象进行操做会影响原来对象,这真的是值传递么?

 

package com.test;

public class TestDemo {
    public static void main(String[] args) {
        TestDemo2 testDemo2 = new TestDemo2();
        System.out.println("调用前:" + testDemo2.age);
        testValue(testDemo2);
        System.out.println("调用后:" + testDemo2.age);
    }
    
    public static void testValue(TestDemo2 testDemo) {
        testDemo.age = 9;
    }
}

class TestDemo2 {
    int age = 1;
}

 

打印结果

调用前:1
调用后:9

 对于这种状况的解释是,传入的参数是testDemo2 对象地址值的一个拷贝,可是形参和实参的值都是同样的,都指向同一个对象,因此对象内容的改变会影响到实参。

综上所述:JAVA的参数传递确实是值传递,无论是基本参数类型仍是引用类型,形参值的改变都不会影响实参的值。若是是引用类型,形参值所对应的对象内部值的改变

会影响到实参。

 

 

若有疑问或写的不恰当的地方欢迎在评论区指出!!

相关文章
相关标签/搜索