Java值传递

Java值传递

定义参数:实参形参

定义参数分为实参形参

形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

参数传递方式:值传递引用传递

调用有参方法的时候,会将实际参数传递给形式参数。

在程序执行过程中,传递过程可以分为值传递引用传递两种形式

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java是值传递?
代码测试1:
//值传递
public class Demo03 {
    public static void main(String[] args) {
        int a =1;
        System.out.println(a);//1

//        Demo03.change(a);
        change(a);
        System.out.println(a);//1
    }

    //返回值为空
    public static void change(int a){
        a = 10;
    }

}

传递的是int类的值。

代码测试2:
public class passTest02 {

    public static void main(String[] args) {
        passTest02 passTest02 = new passTest02();
        User wenyao = new User();
        wenyao.setName("wenyao");
        wenyao.setGender("Male");

        passTest02.pass(wenyao);
        System.out.println("print in main, user is "+wenyao.toString());
    }
    
    public void pass(User user){
        //user = new User();//在堆中new了一个User对象,新开辟了一片内存。删掉这行会使得形参User user和实参wenyao指向同一个地址
        //删除前
        //print in pass, user is com.oop.demo01.User@1b6d3586
        //print in main, user is com.oop.demo01.User@4554617c

        //删除后
        //print in pass, user is com.oop.demo01.User@1b6d3586
        //print in main, user is com.oop.demo01.User@1b6d3586
        user.setName("Jeremy");
        System.out.println("print in pass, user is "+ user.toString());
    }
}
class User{
    String name;
    String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}
代码测试3:
public class passTest01 {
    public static void main(String[] args) {
        passTest01 passTest01 = new passTest01();

        String name = "wenyao";//等价 String name = new String ();
        passTest01.pass(name);
        System.out.println("print in main, name is "+name);
    }

    public void pass(String name){等价 String name = new String ();
        name = "Jeremy";//等价于 String name = new String ("Jeremy"),
                       // 即给形参在堆中new了一个对象,开辟了一片内存。于是形参实参指向不同地址
                        //如果不改变name的值,name的值是原来(实参)的引用
        System.out.println("print in pass, name is "+ name);
    }
}

String类是一个特殊的类。传递的String类的对象name,在给name赋值时候实际新开辟了内存空间。

值传递的解释

下面是网友关于java值传递的解释:

传递对象类型的时候是传递引用的拷贝,在swap(Class A,Class B)这个交换方法中,引用的拷贝被交换,但是实际的引用没有被交换,所以得出结论java只有值传递,因为传递的实际该对象的引用即不是该对象的内存地址,而是该引用的拷贝而已。

首先明确两点 ·java中不管是值对象还是引用对象都是值传递·,·在其他方法里面改变引用类型的值肯定是通过引用改变的·,当传递引用对象的时候传递的是复制过的对象句柄(引用),注意这个引用是复制过的,也就是说又在内存中复制了一份句柄,这时候有两个句柄是指向同一个对象的,所以你改变这个句柄对应空间的数据会影响外部的变量的,虽然是复制的但是引用指向的是同一个地址,当你把这个句柄指向其他对象的引用时并不会改变原对象,因为你拿到的句柄是复制过的引用。总结java中的句柄(引用)是复制过的,所以说java只有值传递

参考文章:https://blog.csdn.net/bjweimengshu/article/details/79799485

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值