您的位置:首页 > 编程语言 > Java开发

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

2013-10-12 16:43 645 查看
最近重读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程序设计中对象采用的不是引用调用,实际上,对象引用进行的是值传递。
一个方法不能修改一个基本数据类型的参数;
一个方法可以改变一个对象参数的状态;
一个方法不能实现让一个对象参数引用一个新的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: