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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 值传递 方法