JAVA中的传值与传址

何为方法的传值:表示传输给方法的参数列表中的值以常数值的形式进行传输,也就是调用方法时实参列表的值是一个常量值。

何为方法的传址:表示传输给方法的参数列表中的值以空间地址的形式进行传输,也就是调用方法时实参列表的值是一个对象中的空间地址。

上述方法中根据传址与传值的不同,则方法中的形参列表也不同。如在传值中方法的形参列表中变量的数据类型为基本数据类型,而传址中形参列表中变量的数据类型为引用数据类型。

可用代码和相应的JVM图进行解析,有如下:

public class test5 {
    public static void main(String[] args) {
        test t=new test();//创建test的对象引用名为t
        t.fan1(t.a);//调用对象t中的fan1方法且传入常量值a
        t.fan2(t);//调用对象t中fan2方法且传入对象本身的地址
        System.out.println("经调用方法fan后test中a的值为--》》》"+t.a);
        System.out.println("经调用方法fan后test中b的值为--》》》"+t.b);
    }
}
class test{
//声明变量a b且值相同用以区分传值与传址的测试
    int a=10;
    int b=10;
//声明fan1方法形参列表变量类型为int类型用以接收实参传入的值
    public void fan1(int a){
        a=20;
    }
//声明fan2方法形参列表变量类型为引用数据类型test 用以接收实参传入的值
    public void fan2(test t){
        t.b=20;
    }
}

JAVA中的传值与传址_第1张图片

经结合不难看出在主类test5中main中去声明一个变量t用以存储堆区中创建对象的对象test的空间地址值,为0x111 。并且在main中区调用类test中的方法fan1和fan2,且在类test中声明了值相同的a,b用来测试在主类test5中进行传值与传址的区别。

在JVM中不难看出由main去调用test中的fan1且传入test中的常量a,在由main去调用test中的fan2且传入test的空间地址。且fan1与fan2都是意将值相同的a,b进行更改为20。而最终结构有如下图可视:

JAVA中的传值与传址_第2张图片

其中a的值任为10,而b的值却发生了改变。

所以依我个人的理解为可视为在栈区中存在3个空间,分别是main ,fan1,fan2,其中在main中区调用fan1且传入的参数仅仅为一个常量值,在main中区调用fan2且传入的参数为堆区中创建声明的test对象空间本身, 所以在fan2去改变test中本身b的值则test中b的值则会随之改变。而fan1去改变a值时,a的值确实是在fan1中发生了变化,但在test空间中a的值却没有发生改变,因为fan1中的空间地址与test中的空间地址并不是所处同一块空间。

经结合可总结出:传址传的是对象的空间本身,若改变对象中的属性值时,则该属性的值也会随着改变。而传值传的只是一个常量值,并不会将对象中的属性值进行修改。

上述均个人的小白理解,如有错误,望各位大侠能予以告知。

感谢

你可能感兴趣的:(java,jvm,开发语言)