Java中方法调用时值传递问题的理解
2018-03-10 18:01
399 查看
Java中方法调用时,没有按引用传递这个说法,只有按值传递。基本类型数据的传递和引用类型数据的传递,根本上都是按值传递。
案例一:基本类型数据传递package testExample;
/**
* 基本类型值传递测试
* Title ByValueTest01
* @author cook
* @date 2018年3月10日下午4:57:36
* @version 1.0
*/
public class ByValueTest01 {
public static void main(String[] args) {
int a = 5;
int b = 6;
pass(a,b);
System.out.println(a);
System.out.println(b);
}
public static void pass(int x,int y){
//调用方法,其实就是做了如下注释的操作.记住调用方法时候的隐含操作会方便理解
//x=a;
//y=b;
x = 7;
y = 8;
}
}案例二:引用类型数据传递package testExample;
/**
* 引用类型值传递
* Title ByValueTest02
* @author cook
* @date 2018年3月10日下午5:45:43
* @version 1.0
*/
public class ByValueTest02 {
public static void main(String[] args) {
Tree tree = new Tree(10);
System.out.println("调用方法前,树tree高"+tree);
pass1(tree);
System.out.println("调用pass1方法后,树tree高"+tree);
pass2(tree);
System.out.println("调用pass2方法后,树tree高"+tree);
}
//方法一
public static void pass1(Tree t){
/*
step01:
pass方法被调用时,值得传递是指隐含执行了如下代码:
t=tree;
假设Tree的实例变量tree在内存中的地址是zx001,这里会有一个赋值t=zx10;
*/
/**
step02:
t本来被赋值t=zx10,到了t = new Tree(20)这一步,是t被重新赋值t=zx20,而没有对内存中tree=zx10这个对象做任何操作。
所以此时t的操作权限是zx20这个内存空间中的内容。
所以调用pass1方法输出tree的值,仍是10
*/
t = new Tree(20);
System.out.println("调用pass1方法时,树t高"+t);
}
//方法二
public static void pass2(Tree t){
/*
step01:
pass方法被调用时,值得传递是指隐含执行了如下代码:
t=tree;
假设Tree的实例变量tree在内存中的地址是zx10,这里会有一个赋值t=zx10;
*/
/**
step02:
t被赋值t=zx10,t被赋值后,没有再被赋其他值
所以t的操作权限是zx10这个内容空间
所以调用pass2方法,是操作zx10空间,空间内的树被拔高到了20,再输出tree的时候,树变成了20米
*/
t.setHeight(20);
System.out.println("调用pass2方法时,树t高"+t);
}
}
class Tree{
private int height;
public Tree(int h){
height = h;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String toString(){
return "树高 " + height + " 米" ;
}
}理解的过程中,注意所说的“方法调用时,隐含执行了xxx代码”,这样会更容易理解
有一位漂亮小姐姐有更深入的解释,只是深入之后新手理解未必友好,附上链接,有兴趣的看一下。第24条是关于方法调用值传递的。 https://www.cnblogs.com/lanxuezaipiao/p/3371224.html
案例一:基本类型数据传递package testExample;
/**
* 基本类型值传递测试
* Title ByValueTest01
* @author cook
* @date 2018年3月10日下午4:57:36
* @version 1.0
*/
public class ByValueTest01 {
public static void main(String[] args) {
int a = 5;
int b = 6;
pass(a,b);
System.out.println(a);
System.out.println(b);
}
public static void pass(int x,int y){
//调用方法,其实就是做了如下注释的操作.记住调用方法时候的隐含操作会方便理解
//x=a;
//y=b;
x = 7;
y = 8;
}
}案例二:引用类型数据传递package testExample;
/**
* 引用类型值传递
* Title ByValueTest02
* @author cook
* @date 2018年3月10日下午5:45:43
* @version 1.0
*/
public class ByValueTest02 {
public static void main(String[] args) {
Tree tree = new Tree(10);
System.out.println("调用方法前,树tree高"+tree);
pass1(tree);
System.out.println("调用pass1方法后,树tree高"+tree);
pass2(tree);
System.out.println("调用pass2方法后,树tree高"+tree);
}
//方法一
public static void pass1(Tree t){
/*
step01:
pass方法被调用时,值得传递是指隐含执行了如下代码:
t=tree;
假设Tree的实例变量tree在内存中的地址是zx001,这里会有一个赋值t=zx10;
*/
/**
step02:
t本来被赋值t=zx10,到了t = new Tree(20)这一步,是t被重新赋值t=zx20,而没有对内存中tree=zx10这个对象做任何操作。
所以此时t的操作权限是zx20这个内存空间中的内容。
所以调用pass1方法输出tree的值,仍是10
*/
t = new Tree(20);
System.out.println("调用pass1方法时,树t高"+t);
}
//方法二
public static void pass2(Tree t){
/*
step01:
pass方法被调用时,值得传递是指隐含执行了如下代码:
t=tree;
假设Tree的实例变量tree在内存中的地址是zx10,这里会有一个赋值t=zx10;
*/
/**
step02:
t被赋值t=zx10,t被赋值后,没有再被赋其他值
所以t的操作权限是zx10这个内容空间
所以调用pass2方法,是操作zx10空间,空间内的树被拔高到了20,再输出tree的时候,树变成了20米
*/
t.setHeight(20);
System.out.println("调用pass2方法时,树t高"+t);
}
}
class Tree{
private int height;
public Tree(int h){
height = h;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String toString(){
return "树高 " + height + " 米" ;
}
}理解的过程中,注意所说的“方法调用时,隐含执行了xxx代码”,这样会更容易理解
有一位漂亮小姐姐有更深入的解释,只是深入之后新手理解未必友好,附上链接,有兴趣的看一下。第24条是关于方法调用值传递的。 https://www.cnblogs.com/lanxuezaipiao/p/3371224.html
相关文章推荐
- Java方法调用时传递参数问题
- 深入理解Java的方法调用一(值传递和引用传递)
- 深入理解java方法调用时的参数传递
- java方法调用都是值传递的理解
- java 关于对“是否可以从一个static方法内部发出对非static方法的调用”问题的理解
- 深入理解Java方法调用的参数传递
- JNI:Java调用C/C++-传递空值(null)的处理方法
- java 中值传递与引用传递以及方法中别名的问题
- JAVA关于方法调用的代码写法与性能问题
- javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法
- JAVA+AXIS客户端调用Asp.net Web Service过程中遇到的问题及解决方法
- cocos2dx调用Java方法的问题
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- (转载)java调用linux命令传递参数问题
- java中远程对象方法调用中的安全策略问题
- Java中通过反射调用其他类中的main方法时要注意的问题
- Java中通过反射调用其他类中的main方法时要注意的问题
- C#调用Java端Web服务(CXF)时发生Integer参数类型无法传递的问题
- 一个.NET工程在调用Java方法的时候不能创建JVM的问题及其原因
- java方法重写的时候,一个调用父类还是子类方法的问题