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,就到这里! 阅读更多
相关文章推荐
- Java方法调用时传递参数问题
- java的方法调用,参数是按值传递还是按引用传递
- 关于Java中方法调用时参数的传递
- (转载)java调用linux命令传递参数问题
- 关于java方法参数中,值传递与引用传递问题
- 深入理解Java方法调用的参数传递
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
- 关于Java中方法调用时参数的传递
- Java可变长参数方法调用问题
- 10.5在Java中创建与传递Groovy闭包(在java中调用groovy方法,并且传递闭包参数)
- 深入理解java方法调用时的参数传递
- java调用linux命令传递参数问题
- java方法调用中参数传递的方式
- java调用linux命令传递参数问题
- 有关java的函数调用返回值的问题和参数传递问题
- java中的void修饰的方法,方法重载,方法参数传递问题
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
- js调用方法传递变量作为参数的问题
- Java方法中参数的传递问题总结
- c/c++/java,函数调用的参数的传递方法