java方法调用时的参数传递问题

OOP编程中会涉及到方法调用的参数传递问题。之前一直没搞明白“值传递”与“引用传递”,在网上找了些资料,发现也说的模糊不清。经过小弟一整天时间的研究发现,以调用方法时传递参数的是变量为前提,那么参数传递都是拷贝传递。下面分为两中类型来说:基本数据类型和引用数据类型。

一,基本数据类型

基本数据类型赋值给变量后,变量存储的就是变量的具体值;当调用一个方法需要传递该基本数据类型变量时,java是将该变量的具体内容拷贝传递给方法。在被调用的方法中拿到的变量只是原来具体值的副本,所以在被调用方法中操作局部变量并不会影响调用方法中的变量的内容(注意:拷贝传递)

代码如下:

 
 
 
public class Test{

    static void function(int x){
        x = 10;
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        int x = 5;
        function(x);
        System.out.println("x = " + x);//运行结果
    }
}

// 运行结果
Hello World!
x = 5

二,引用数据类型

引用数据类型赋值给变量后,变量中存储的是什么呢?与基本数据类型不同的是,引用数据类型变量存储的是对象的引用(地址值,指针)。由于java中方法参数的传递是拷贝传递,那么被调用的方法的形参接收到的就是引用的拷贝。也就是说此时有多个变量指向同一个对象。当然在被调用的方法体中操作对象是会影响到调用者中的对象的,因为两者是指向同一个对象。这里有一个问题,如果可以理解的话,那么参数传递的问题就不会再困扰你了。请看代码:

public class Main {

    static void function(Tank tank){
        tank = null;
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        Tank tank = new Tank(5);
        System.out.println("原来tank.x = " + tank.x);
        function(tank);
        System.out.println("变换后tank.x = " + tank.x);
    }
}

class Tank {
    int x;

    public Tank(){}

    public Tank(int x){
        this.x = x;
    }
}

//运行结果
Hello World!
原来tank.x = 5
变换后tank.x = 5
为什么没有报NullPointerExceotion呢?不是说引用数据类型的传递会影响原来的值吗?其实,这里需要注意的关键问题就是拷贝传递,function()的形参接收到的是传过来的地址值,但是原方法中的tank也还存储着这个对象的地址值啊。执行tank = null;只是将形参的地址值置为null。再看下面一段代码:

public class Main {

    static void function(Tank tank){
        tank.x = 10;
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        Tank tank = new Tank(5);
        System.out.println("原来tank.x = " + tank.x);
        function(tank);
        System.out.println("变换后tank.x = " + tank.x);
    }
}

class Tank {
    int x;

    public Tank(){}

    public Tank(int x){
        this.x = x;
    }
}
// 运行结果
Hello World!
原来tank.x = 5
变换后tank.x = 10
果然值变了。你想啊,由于是拷贝传递,在function()中的tank变量也是指向原来的那个对象,那么这里的一顿操作势必会改变对象的内容。ok,就到这里!

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值