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网站,感觉超级适合入门级的Java开发,
基础知识写的挺好,练手项目也很丰富很,基本都是文档形式指导,简明易懂,不像视频一样费时间。
地址是http://how2j.cn?p=24192