文档章节

Java方法参数使用

一别丶经年
 一别丶经年
发布于 2016/07/18 14:17
字数 832
阅读 33
收藏 1

使用Java工作很长时间了,最近阅读《Java核心技术-卷I(第8版)》时,却总能发现一些自己对Java错误的理解之处,今天要说的是关于Java方法参数使用部分(4.5节)。 小节开篇讲到

Java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。

下面给出一个例子来说明

int number = 10 ;
System.out.println(number);	// 10		
triple(number);		        // 执行三倍操作
System.out.println(number);	// 10

暂时不用管triple方法实现是怎样,可以看出方法执行前后,number的值是没有改变的,下面是triple方法的实现

private static final void triple(int x) {
	x = 3 * x ;
}

下面用图说明整个过程(网上找到的图都很模糊,这里我自己重新画了一个)
具体执行过程:

  1. x被初始化为number的一个拷贝。
  2. x被乘以3后等于30,但此时number本身仍是10。
  3. 这个方法结束后,x的生命周期结束,值被丢弃。

这里可以看出,方法不可以改变基本类型参数,而作为引用参数则不同

public class Employee {

	private String name ;
	private double salary ;
	
	public Employee(String name ,double salary) {
		this.name = name ;
		this.salary = salary ;
	}
	
	public void setSalary(double salary) {
		this.salary = salary;
	}

	public double getSalary() {
		return salary;
	}

}

通过以下测试可以看出引用对象的值发生了变化

Employee jane = new Employee("jane" ,1000) ;

System.out.println(jane.getSalary());	// 1000.0
		
triple(jane) ;	// 工资变更为3倍
		
System.out.println(jane.getSalary());	// 3000.0

下面是triple方法的实现

public static final void triple(Employee e) {
	e.setSalary(e.getSalary() * 3);
}

同样用图说明

  1. e被初始化为jane的值拷贝,这里是一个对象引用,此时e引用了与jane所引用的实例。
  2. triple方法将e引用实例的的salary变更为3倍。
  3. 方法结束后,e被丢弃。但其引用的实例的salary已提高为原来的3倍,而jane仍引用着该实例。

上述是改变对象状态(属性)的方法,但引用本身却无法改变(容易搞错的地方)

Employee jane = new Employee("jane" ,1000) ;
Employee john = new Employee("john" ,1200) ;

// com.zlikun.jee.Employee@578088c0
System.out.println(jane);
// com.zlikun.jee.Employee@37922221
System.out.println(john);
		
swap(jane, john);
		
// com.zlikun.jee.Employee@578088c0
System.out.println(jane);
// com.zlikun.jee.Employee@37922221
System.out.println(john);

下面给出swap方法的实现

static void swap(Employee e1 ,Employee e2) {
	Employee t = e1 ;
	e1 = e2 ;
	e2 = t ;
}

通过输出结果可以发现,交换前后,jane、john引用的实例并未发生变化。

以上测试,《Java核心技术-卷I(第8版)》给出的结论是:

  1. 一个方法不能修改一个基本数据类型的参数
  2. 一个方法可以改变一个对象参数的状态
  3. 一个方法不能实现让对象引用一个新的对象

本文同步自:http://zlikun.com/java-method-arguments/

© 著作权归作者所有

共有 人打赏支持
一别丶经年
粉丝 25
博文 36
码字总数 56401
作品 0
徐汇
架构师
私信 提问
Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao
2018/01/20
0
0
clojure 新手指南(10):与java交互

clojure是基于jvm的语言,就是说clojure会被编译成字节码被jvm执行。但是clojure能做的可不仅仅是被编译成字节码,它提供了一套API让用户与java交互。因此clojure可以直接调用java世界中那些...

凯奥斯
2013/07/07
0
1
1-Java基础语法-Java初识

欢迎大家来到java世界 带领大家领略编程的奥秘。 人与人沟通需要语言。计算机世界的沟通语言。 Java语法结构,使用循环和选择流控制结构,了解方法和数组的使用。 Java简介 Java是一门编程语...

天涯明月笙
2018/07/29
0
0
如何唯一确定一个 Java 类?

今天偶然想起之前和朋友讨论过的一个问题:如何唯一确定一个 Java 类?我相信大多数朋友遇到这个问题的回答都是:类的全路径呗。但事实上,唯一确定一个 Java 类,单单靠类路径是不够的,还要...

陈树义
2018/09/14
0
0
Java中系统属性Properties介绍 System.getProperty()参数大全

在JDK文档中System类中有这样的方法getProperties()在此方法的详细介绍中有下面的参数可供使用: java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Ja...

星痕2018
2012/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 下安装 Nginx

1、添加Nginx存储库 要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令 yum install epel-release 2、安装Nginx 现在Nginx存储库已经安装在您的服务器上,使用以下yum命令安装Nginx yum i...

Oo若离oO
13分钟前
0
0
漏洞防御与修复工作

漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术和管理...

linuxprobe16
今天
1
0
MicroPython技术及应用前景

1 Micropython技术是什么? MicroPython极精简高效的实现了Python3语言。它包含Python标准库的一小部分,能在单片机和受限环境中运行。 1.1 MicroPython发展 由剑桥大学的理论物理学家乔治....

bodasisiter
今天
5
0
跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

本节详细讲解使用Hystrix的通用方式。 简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要...

周立_ITMuch
今天
2
0
🛠️Hanjst/汉吉斯特更新加JavaScript运行时优化等

这是 Hanjst/汉吉斯特 发布以来的首个主要升级更新版本。这次的主要升级更新的内容包括移除HTML Comments注释行, 优化在 Hanjst include模板文件时的JavaScript运行时环境。 Hanjst 在设计和...

wadelau
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部