《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.
到这里终于对传值还是传引用明白多了.呵呵,不知道别人能看明白我这篇东西不?文彩不好,请见谅了...
睡觉
相关文章推荐
- 调试存储过程或触发器时请先看看是本地数据库还是其它服务器
- ASP.NET 链接 Access 服务器 数据库路径问题 经过验证可解决问题
- SQL不同服务器数据库之间的数据操作整理(完整版)
- php读取服务器(CentOS 6.5)状态并存入数据库
- SQLSERVER简单创建DBLINK操作远程服务器数据库的方法
- 数据库系统概念-读书笔记-大纲
- MySQL - 5. 数据库管理 - 5.3. mysqld:MySQL服务器 - 5.3.3. 服务器系统变量 - max_allowed_packet
- 通达OA服务器意外断电后数据库容易损坏的解决方案
- CAS5.2x单点登录(二)cas服务器连接数据库
- 服务器数据库系列 - 解析nginx负载均衡
- 如何用Java得到数据库服务器的名称?
- java中使用应用服务器配置的数据库连接
- openfire3.9.3服务器的外部数据库配置mysql
- 不同服务器数据库之间的数据操作
- 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量
- 发布服务器 bugzilla, streber 数据库备份方案
- Oracle数据库服务器本机使用expdp方式导出/导出数据库(排除表)
- SQL 本地数据库数据插入到服务器数据库
- Android聊天客户端Demo,开源了.基本功能都有,数据库,服务器都Ok