文档章节

Java方法参数使用

一别丶经年
 一别丶经年
发布于 2016/07/18 14:17
字数 832
阅读 31
收藏 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/

© 著作权归作者所有

共有 人打赏支持
一别丶经年
粉丝 24
博文 36
码字总数 56401
作品 0
徐汇
架构师
用 JNI 进行 Java 编程(3)

从 C/C++ 程序调用 Java 代码 概述 JNI 允许您从本机代码内调用 Java 类方法。要做到这一点,通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。下列是您可能决定从 C/C++ 代码...

Jerikc
2012/10/08
0
0
SpringMVC之接收请求参数和页面传参

Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name")......

白志华
2015/09/23
0
0
Java基础知识——JNI入门介绍

Java类型和本地类型对应     在如下情况下,需 要在本地方法中应用java对象的引用,就会用到类型之间的转换:   1)java方法里面将参数传入本地方法;   2)在本地方法里面创建java对...

cyper
2013/09/19
0
0
JNI中java类型与C/C++类型对应关系(转)

JNI中java类型与C/C++类型对应关系 JNI中java类型与C/C++类型对应关系 在如下情况下,需要在本地方法中应用java对象的引用,就会用到类型之间的转换:   1)java方法里面将参数传入本地方法...

DannyCoder
09/02
0
0
Java NIO AsynchronousFileChannel

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

Neil_Hao
01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day92-20180918-英语流利阅读-待学习

健身最大的敌人不是懒惰,而是逞强 Daniel 2018-09-19 1.今日导读 还记得 2008 年北京奥运会运动员刘翔的退赛风波吗?那天几乎所有中国人都将视线聚焦在了鸟巢体育馆 110 米栏的项目上,迫不...

飞鱼说编程
13分钟前
1
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部