Java核心技术笔记—方法参数(值调用和引用调用)

最近重读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程序设计中对象采用的不是引用调用,实际上,对象引用进行的是值传递。
    • 一个方法不能修改一个基本数据类型的参数;
    • 一个方法可以改变一个对象参数的状态;
    • 一个方法不能实现让一个对象参数引用一个新的对象。

你可能感兴趣的:(Java核心技术笔记—方法参数(值调用和引用调用))