文档章节

Java方法参数使用

一别丶经年
 一别丶经年
发布于 2016/07/18 14:17
字数 832
阅读 30
收藏 1
点赞 0
评论 0

使用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/

© 著作权归作者所有

共有 人打赏支持
一别丶经年
粉丝 15
博文 21
码字总数 25694
作品 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
Java NIO AsynchronousFileChannel

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

Neil_Hao
01/20
0
0
JDBC基础教程之CallableStatement

概述      CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调...

xiahuawuyu
2012/07/09
0
0
如何让Java和C++接口互相调用:JNI使用指南

写在前面的话 对于cocos2d-x开发者而言,游戏对多平台的支持是一个刚需,一般而言需要支持Android和iOS。然而,在开发过程中,android 平台遇到的一系列问题着实让人头疼,本文以集成新浪微博...

zhangyujsj
2015/08/23
0
0
云栖社区专家系列课——Java必修课第一讲

本节课为 Java必修课第一讲。在本节课中,最课程创始人、微软MVP陆敏枝为了大家介绍了当前Java行业的IT人才供需情况、Java基本语法、JDK的下载与安装、Java环境变量的配置以及第一个Java程序...

笑傲江湖lcx
07/03
0
0
Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: [cpp] view plai...

zhangyujsj
2015/08/23
0
0
android开发教程(4)— jni编程之采用 javah 从java调用C++

用Java调用C/C++代码 当无法用 Java 语言编写整个应用程序时,JNI 允许您使用本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言去实现对时间有严格要求的...

刘小米
2014/09/18
0
1
Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部