JAVA2核心技术阅读笔记(一)
2007-07-07 15:19
465 查看
第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递, 作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。
先构建一个Person类,有name和age两个字段
public class Person ...{
String name;
int age;
public Person(String name,int age)...{
this.name = name;
this.age = age;
}
public int getAge() ...{
return age;
}
public void setAge(int age) ...{
this.age = age;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
然后再设计一个personSwap方法,传入两个Person对象引用,先对这两个对象引用进行对象交换操作,然后再对两个对象中的name字段值进行交换操作。最后,在main中调用方法。最后生成的结果我都写在了注释中
public class PersonUtil ...{
public static void personSwap(Person a, Person b) ...{
/**//*
* 传入的对象引用,这里指向的对象和在传入前的是一样的
* 打印结果
* ------------------swapbegin------------------
* Person a:Person@11b86e7 name:aaa age:1
* Person b:Person@35ce36 name:bbb age:2
*/
System.out.println("------------------swap begin------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 开始交换对象
* 打印结果
* ------------------swap reference------------------
* Person a:Person@35ce36 name:bbb age:2
* Person b:Person@11b86e7 name:aaa age:1
*/
System.out
.println("------------------swap reference------------------");
Person tmp1 = a;
a = b;
b = tmp1;
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 交换对象中name字段的值
* 打印结果
* ------------------swap field value------------------
* Person a:Person@35ce36 name:aaa age:2
* Person b:Person@11b86e7 name:bbb age:1
*/
System.out
.println("------------------swap field value------------------");
String tmp2 = a.getName();
a.setName(b.getName());
b.setName(tmp2);
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 交换完成后
* 打印结果
* ------------------swap end------------------
* Persona:Person@35ce36 name:aaa age:2
* Person b:Person@11b86e7 name:bbb age:1
*/
System.out.println("------------------swap end------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
}
public static void main(String[] args) ...{
Person a = new Person("aaa", 1);
Person b = new Person("bbb", 2);
/**//*
* 生成两个对象,对象引用为a、b
* 在交换前的初始数据
* 打印结果
* ------------------before swap------------------
* Person a:Person@11b86e7 name:aaa age:1
* Person b:Person@35ce36 name:bbb age:2
*/
System.out.println("------------------before swap------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
PersonUtil.personSwap(a, b); // 调用方法,进入方法体
/**//*
* 方法调用结束,返回main() 打印结果
* ------------------after swap------------------
* Person a:Person@11b86e7 name:bbb age:1
* Person b:Person@35ce36 name:aaa age:2
*/
System.out.println("------------------after swap------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
}
}
其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。
先构建一个Person类,有name和age两个字段
public class Person ...{
String name;
int age;
public Person(String name,int age)...{
this.name = name;
this.age = age;
}
public int getAge() ...{
return age;
}
public void setAge(int age) ...{
this.age = age;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
然后再设计一个personSwap方法,传入两个Person对象引用,先对这两个对象引用进行对象交换操作,然后再对两个对象中的name字段值进行交换操作。最后,在main中调用方法。最后生成的结果我都写在了注释中
public class PersonUtil ...{
public static void personSwap(Person a, Person b) ...{
/**//*
* 传入的对象引用,这里指向的对象和在传入前的是一样的
* 打印结果
* ------------------swapbegin------------------
* Person a:Person@11b86e7 name:aaa age:1
* Person b:Person@35ce36 name:bbb age:2
*/
System.out.println("------------------swap begin------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 开始交换对象
* 打印结果
* ------------------swap reference------------------
* Person a:Person@35ce36 name:bbb age:2
* Person b:Person@11b86e7 name:aaa age:1
*/
System.out
.println("------------------swap reference------------------");
Person tmp1 = a;
a = b;
b = tmp1;
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 交换对象中name字段的值
* 打印结果
* ------------------swap field value------------------
* Person a:Person@35ce36 name:aaa age:2
* Person b:Person@11b86e7 name:bbb age:1
*/
System.out
.println("------------------swap field value------------------");
String tmp2 = a.getName();
a.setName(b.getName());
b.setName(tmp2);
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
/**//*
* 交换完成后
* 打印结果
* ------------------swap end------------------
* Persona:Person@35ce36 name:aaa age:2
* Person b:Person@11b86e7 name:bbb age:1
*/
System.out.println("------------------swap end------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
}
public static void main(String[] args) ...{
Person a = new Person("aaa", 1);
Person b = new Person("bbb", 2);
/**//*
* 生成两个对象,对象引用为a、b
* 在交换前的初始数据
* 打印结果
* ------------------before swap------------------
* Person a:Person@11b86e7 name:aaa age:1
* Person b:Person@35ce36 name:bbb age:2
*/
System.out.println("------------------before swap------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
System.out.println();
PersonUtil.personSwap(a, b); // 调用方法,进入方法体
/**//*
* 方法调用结束,返回main() 打印结果
* ------------------after swap------------------
* Person a:Person@11b86e7 name:bbb age:1
* Person b:Person@35ce36 name:aaa age:2
*/
System.out.println("------------------after swap------------------");
System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
+ a.getAge());
System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
+ b.getAge());
}
}
其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。
相关文章推荐
- #Java 核心技术卷一阅读笔记# 第九章 集合
- Java2核心技术学习笔记 分类: java 2009-11-29 23:54 339人阅读 评论(0) 收藏
- #Java 核心技术卷一阅读笔记# 第七章 异常、断言和日志
- Java核心技术 卷Ⅰ阅读笔记
- Java多线程编程核心技术 阅读笔记
- #Java 核心技术卷一阅读笔记# 第十一章 事件处理
- #Java 核心技术卷一阅读笔记# 第十二章 Swing用户界面组件
- Java核心技术基础篇 第四章 类与对象 阅读笔记
- 大型网站技术架构-核心原理与案例分析-阅读笔记5
- Java核心技术学习笔记之二:Java运算符
- 《Java 多线程编程核心技术》学习笔记及总结
- Java核心技术 卷一 笔记2 字符串的复制
- Java 核心技术卷Ⅰ笔记
- 大型网站技术架构:核心原理与案例分析阅读笔记六
- Java2核心技术第七版的学习笔记(一):An Introduction to Java(Java的介绍)
- 大型网站技术架构:核心原理与案例分析阅读笔记之五
- java核心技术学习笔记1---基本概念
- java 学习笔记 核心技术I
- java核心技术学习笔记7---继承与多态
- Java2核心技术学习笔记