Fork me on Github

Java之方法参数

将参数传递给方法的两种方式:

1.按值调用(call by value),方法接收的是调用者提供的值;

2.按引用调用(call by reference),方法接收的是调用者提供的变量地址。

最早还有按名调用(call by name),已成历史。

 

一、基本数据类型的参数

 

代码如下:

复制代码
 1 public class ClassTest {
 2 
 3     int num = 9;
 4 
 5     static void increase(int x) {
 6         x = x * 9;
 7     }
 8 
 9     public static void main(String[] args) {
10         ClassTest ct = new ClassTest();
11         increase(ct.num);
12         System.out.println("num = " + ct.num);
13     }
14 }
复制代码

 

输出结果:

num = 9

 

结果分析:

1. x 初始化为 ct.num 的一个副本,x 值为 9;

2. x 乘以 9 后等于 81 ,但 ct.num 值仍为 9;

3.方法结束后,参数变量 x 不再使用。

 

二、引用类型的参数

 

代码如下:

复制代码
public class ClassTest {

    int num = 9;

    static void increase2(ClassTest c) {
        c.num = c.num * 9;
    }

    public static void main(String[] args) {
        ClassTest ct = new ClassTest();
        increase2(ct);
        System.out.println("num = " + ct.num);
    }
}
复制代码

 

输出结果:

num = 81

 

结果分析:

1. c 初始化为 ct 的一个副本,这里就是一个对象引用;

2. c 和 ct 同时引用的 ClassTest 对象的 num 值被扩大了九倍;

3.方法结束后,参数变量 c 不再使用,对象变量 ct 继续引用 num 值扩大九倍后的对象。

 

三、对象引用

 

 “Java程序设计语言对对象采用的是按引用调用”,实际上,这种理解是不对的,但这种误解也具有一定的普遍性。

 

反例如下:

复制代码
 1 public class ClassTest {
 2 
 3     int num = 9;
 4 
 5     static void increase2( ClassTest c) {
 6         c.num = c.num * 9;
 7     }
 8 
 9     static void swap(ClassTest x, ClassTest y) {
10         ClassTest temp = x;
11         x = y;
12         y = temp;
13     }
14 
15     public static void main(String[] args) {
16         ClassTest ct1 = new ClassTest();
17         ClassTest ct2 = new ClassTest();
18 
19         increase2(ct2);     // ct2.num = 81
20         swap(ct1, ct2);     // 若按引用调用,则交换后 ct1.num = 81,ct2.num = 9
21         System.out.println("ct1.num = " + ct1.num);
22         System.out.println("ct2.num = " + ct2.num);
23     }
24 }
复制代码

 

输出结果:

ct1.num = 9
ct2.num = 81

 

结果分析:

这个方法并没有改变储存在变量 ct1 和 ct2 中的对象引用,swap 方法参数 x 和 y 被初始化为两个对象的副本,这个方法交换的是这两个的副本。

方法结束时,参数 x 和 y 被丢弃,原来的变量 ct1 和 ct2 仍引用方法调用之前所引用的对象。

结果说明,Java程序设计语言对对象采用的不是按引用调用,对象引用是按值传递的。

 

四、总结

 

“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

在Java里面只有基本数据类型和String是按值传递,其它的都是按引用传递。

 

在Java中对方法参数能做什么和不能做什么:

1.方法不能改变基本类型的参数(即数值型或布尔型);

2.方法可以改变对象参数的状态;

3.方法不能让一个对象参数引用一个新的对象。

posted @   菜鸟昂  阅读(529)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示