java方法调用时的参数传递问题
来源:互联网 发布:热敏打印机软件 编辑:程序博客网 时间:2024/05/22 01:55
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,就到这里!
阅读全文
1 0
- Java方法调用时传递参数问题
- java方法调用时的参数传递问题
- 关于Java中方法调用时参数的传递
- 关于Java中方法调用时参数的传递
- 关于Java中方法调用时参数的传递
- 关于Java中方法调用时参数的传递
- 关于Java方法参数的传递问题
- 调用方法时参数的传递
- JAVA调用c++时参数的传递
- java方法参数传递问题
- java方法参数传递问题
- c/c++/java,函数调用的参数的传递方法
- 深入理解Java方法调用的参数传递
- java方法传递参数传递的到底是什么?值调用:引用调用
- java调用linux命令传递参数问题
- java调用linux命令传递参数问题
- 关于Java 传递参数时的问题
- C#调用Java端Web服务(CXF)时发生Integer参数类型无法传递的问题
- Linux内核中获取时间函数do_gettimeofday
- 虚拟机的Ubuntu与本机ping通
- python:简单的梯度下降算法
- Mybatis学习笔记(四)-----一对多关系配置
- Python3下载图片
- java方法调用时的参数传递问题
- java异常分析;剖析printStackTrace和fillInStackTrace
- 基于CentOS7将JavaWeb项目生成docker镜像
- SourceTree如何创建新分支
- golang语言错误: object is [windows amd64 go1.8 X:framepointer] expected [windows amd64 go1.9 X:framepoin
- linux 命令行快捷键
- 在使用winscp.exe 作为命令行参数执行远程命令时遇见无法执行的情况
- CentOS Linux搭建SVN服务器
- 使用lock 产生死锁