最近重读Java核心技术,不得不说的是这本书确实不错。虽然本人不太喜欢做笔记,但还是觉得某些重要的地方必须要记一下。
关于方法参数调用一般有两种:值调用(call by value)和引用调用(call by reference)。顾名思义,值调用表示方法接收的是调用者提供的值;引用调用表示方法接收的是调用者提供的变量的地址。
特别重要的是:在Java中,程序设计总是采用值调用。即:方法得到的是所有参数值得一个拷贝,方法不能修改传递给它的任何参数变量的内容。
这里用一个例子来说明,如下代码:
public class TestMP {
public static void main(String[] args) {
System.out.println("=== 测试基本数据类型 ===");
int a = 30;
System.out.println("调用前 a=" + a);
tripValue(a);
System.out.println("调用后 a=" + a);
System.out.println();
System.out.println("=== 测试对象引用参数 ===");
Book ba = new Book("Java核心技术", 30);
Book bb = new Book("算法技术手册", 20);
System.out.println("调用前");
System.out.println(ba);
System.out.println(bb);
System.out.println();
System.out.println("对象引用类型参数调用可以改变对象内容");
adjustPrice(ba);
System.out.println(ba);
System.out.println();
System.out.println("对象引用类型参数调用不能改变参数引用值");
swapBook(ba, bb);
System.out.println(ba);
System.out.println(bb);
}
static void tripValue(int data) { // doesn't work
data = data * 3;
}
static void adjustPrice(Book aBook) {
aBook.setPrice(100.0);
}
static void swapBook(Book x, Book y) { // doesn't work
Book temp = x;
x = y;
y = temp;
}
}
class Book {
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public void setPrice(double p) {
this.price = p;
}
//
@Override
public String toString() {
return "[name=" + this.name + ", price=" + this.price + "]";
}
}
这段程序输出如下:
=== 测试基本数据类型 ===调用前 a=30
调用后 a=30
=== 测试对象引用参数 ===
调用前
[name=Java核心技术, price=30.0]
[name=算法技术手册, price=20.0]
对象引用类型参数调用可以改变对象内容
[name=Java核心技术, price=100.0]
对象引用类型参数调用不能改变参数引用值
[name=Java核心技术, price=100.0]
[name=算法技术手册, price=20.0]
总结一下:
- Java程序设计中对象采用的不是引用调用,实际上,对象引用进行的是值传递。
- 一个方法不能修改一个基本数据类型的参数;
- 一个方法可以改变一个对象参数的状态;
- 一个方法不能实现让一个对象参数引用一个新的对象。