您的位置:首页 > 编程语言 > Java开发

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

2017-10-12 16:56 120 查看

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,就到这里!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: