您的位置:首页 > 数据库

《SQL学习指南》读书笔记一 数据库还是服务器

2012-11-30 14:55 148 查看

例子代码
public class ParaTest {

protected int intNum = 0;//栈A

public static void main(String[] args) {
ParaTest pt=new ParaTest();//对像A

pt.change(pt.intNum);
System.out.println("change int "+pt.intNum);(1)

pt.change(pt);
System.out.println("change pt.int "+pt.intNum);(2)

pt.add(pt.intNum);
System.out.println("add pt "+pt.intNum);(3)

pt.add(pt);
System.out.println("add pt "+pt.intNum);(4)

}

public void change(int i) {栈B
i = 5;//	(5)
}

public void change(ParaTest t) {
ParaTest tmp = new ParaTest();//对像B
tmp.intNum = 9;
t = tmp;
System.out.println("change pt.int inner"+t.intNum);(6)
}

public void add(int i) {栈C
i += 10;//(7)

}

public void add(ParaTest pt){
pt.intNum+=20;
System.out.println("change pt.int inner"+t.intNum);(8)
}

}

呵呵...今晚看这个例子时,朋友说你要理解原理的话,不管题目怎么变,你依然能看出是传了值还是传了引用...
先看看参数为ParaTest的两个方法
public void change(ParaTest t) {
ParaTest tmp = new ParaTest();//对像B
tmp.intNum = 9;
t = tmp;

}
public void add(ParaTest pt){
pt.intNum+=20;
}

调用change(ParaTest t)方法后,方法外部传入的引用变量 pt 中的intNum的值还是没变的.因为执行main这个方法时,main方法所有的东西都存在一个栈中.这个栈中有一格是存放 pt 这个变量的指针的..pt 的指针指内堆中的new ParaTest()对像.即main方法中第一行代码里新建的 ParaTest()对像.

当在main 中调用change(ParaTest t)时,又会出现一个栈是存放这个方法体中的所有东西,在change(ParaTest t)方法中的栈有一格是存放了传入参数t的指针,也有一格是存放了tmp变量的指针,tmp的指针指向的是change(ParaTest t)中新建的ParaTest对像,跟传入参数t的指针所指的不是同一个对像.

当执行t=tmp;这条语句时,tmp的指针会复盖掉t的指针,此时 t 的指针将指向change(ParaTest t)方法中第一行代码所新建的那个B对像.由于对像B的intNum的值已经被赋值成9.所以代码中(6)这句打印时,出来的t.intNum的结果是9.因为(6)的打印语句中的 t 指的是对像B.在(2)这句打印语句中 pt 指的对像是对像A.因为A的intNum值没变改变,所以打印出来结果是0.而在add(ParaTest pt)由于pt的指针是一直指向对像A的.即在add(ParaTest pt)中, pt 这个变量没被重新赋值,所以pt.intNum值改变时,对像A的intNum值也跟着改变.打印语句(4)的打印结果是20.

public void change(int i) {//栈B
i = 5;	//(5)
}

public void add(int i) {//栈C
i += 10;  //(6)

}

change(int i)与add(int i)这两个方法由于传的都是基本类型,JAVA中基本类型参都是传值的.基本类型在堆中有并没有相应的对像.在执行change(int i)与add(int i)方法时,都会各自产生一个栈,栈里都有一格是用来存放参数变量,即栈B,与栈C.所以,无论是类的全局变量栈A,或方法中的局部变量栈B,栈C,它们都在自已所属的栈中占有一个独立的位置,所以代码(5)跟(6)的操作,并不会改变栈A的值,所以(1)跟(3)处打印出来pt.intNum的值还是0.如果在change(int i)与add(int i)这两个方法中打印出i的值的话,则会是5跟10.

到这里终于对传值还是传引用明白多了.呵呵,不知道别人能看明白我这篇东西不?文彩不好,请见谅了...

睡觉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: