`
poyunri
  • 浏览: 29818 次
文章分类
社区版块
存档分类
最新评论

4.5 方法参数

 
阅读更多
1、专业术语:
值调用(call by value)表示方法接收的是调用者所提供的值。
引用调用(call by reference)表示方法接收的是调用者所提供的变量地址。
方法可以修改传递引用所对应的变量,但是不能修改传递值调用所对应的变量值

2、Java中总是采用值调用。即方法得到的是所有参数值的一个拷贝值,方法的作用效果均是在这个拷贝值上体现,与原本真实值无关。所以Java中的方法不能修改传递给他的任何参数变量。
例如,假定一个方法试图将参数值增至3倍:
public static void tripleValue(double x) {
x = 3 * x;
}
double percent = 10;
tripleValue(percent);
这个方法结束后percent仍为10,而对象引用参数x的值为30.但是方法结束后参数变量x不再使用,所以percent仍为10.
具体执行过程:
(1)x被初始化为percent值的一个拷贝(即x = 10)
(2)x被方法作用,值变为30.此时percent为10
(3)方法结束后,x不再使用

注意:方法参数有两种类型:基本数据类型(数字、布尔值)和对象引用。已经知道方法不能修改基本类型参数,但可以修改引用参数。

3、下面这个方法是将雇员薪金提高两倍:
public static void tripleSalary(Employee x) {
x.raiseSalary(200);
}
harry = new Employee;
tripleSalary(harry);
执行过程:
(1)x被初始化为harry的拷贝值,这里是一个引用对象;
(2)raiseSalary犯法作用在这个引用对象上。x和harry同时应用的Employee对象的薪金提高了200%
(3)方法结束后,参数变量x不再使用,但是harry继续应用被raiseSalary方法作用后的Employee对象

4、很多语言提供两种参数传递方式:值调用和引用调用。Java对对象采用的不是是引用调用。例如:
一个交换两个雇员对象的方法:
public static void swap(Employee x, Employee y) {
Employee temp = x;
x = y;
y = temp;
}
如果Java采用引用调用就应该实现交换数据的效果:
Employee a = new Employee("A");
Employee b = new Employee("B");
swap(a, b);
实际上swap方法的参数x和y被初始为两个对象的拷贝,方法实现的是两个拷贝的交换。方法结束后x和y被丢弃,最终白费力气。
说明:
Java对对象采用的不是引用调用而是值调用。

5、总结下Java中方法参数的使用情况:
一个方法不能修改基本数据类型的参数;
一个方法可以改变一个对象的参数;
一个方法不能实现让对象参数引用一个新的对象。

6、本节源代码,例4-4.
运行效果:
Testing tripleValue:
Before: percent=10.0
End of method: x=30.0
After: percent=10.0

Testing tripleSalary
Before: percent=5000.0
End of method: x=15000.0

Testing swap:
Befor: a=Alice
Befor: b=Bob
After: x=Bob
After: y=Alice
After: a=Alice
After: b=Bob

ParamTest.java:
package com.vincent.javacore.paramtest;

public class ParamTest {
	public static void main(String[] args) {
		//测试一:试图将percent提高两倍,失败了
		System.out.println("Testing tripleValue: ");
		double percent = 10;
		System.out.println("Before: percent=" + percent);
		tripleValue(percent);
		System.out.println("After: percent=" + percent);
		
		//测试二:成功的将一个雇员的薪金提高了两倍
		System.out.println("\nTesting tripleSalary");
		Employee harry = new Employee("harry", 5000);
		System.out.println("Before: percent=" + harry.getSalsry());
		tripleSalay(harry);
		
		//测试三:演示swap失败的效果
		System.out.println("\nTesting swap: ");
		Employee a = new Employee("Alice", 7000);
		Employee b = new Employee("Bob", 6000);
		System.out.println("Befor: a=" + a.getName());
		System.out.println("Befor: b=" + b.getName());
		swap(a, b);
		System.out.println("After: a=" + a.getName());
		System.out.println("After: b=" + b.getName());
	}

	private static void swap(Employee x, Employee y) {
		Employee temp = x;
		x = y;
		y = temp;
		System.out.println("After: x=" + x.getName());
		System.out.println("After: y=" + y.getName());
		
	}

	private static void tripleSalay(Employee x) {
		x.raiseSalary(200);
		System.out.println("End of method: x=" + x.getSalsry());
		
		
	}

	private static void tripleValue(double x) {
		x = 3 * x;
		System.out.println("End of method: x=" + x);		
	}

}
Employee.java
package com.vincent.javacore.paramtest;

public class Employee {
	private String name;
	private double salary;

	public Employee(String n, double s) {
		name = n;
		salary = s;
	}
	public String getName() {
		return name;
	}
	
	public double getSalsry() {
		return salary;
	}
	
	public void raiseSalary(double byPercent) {
		double raise = salary * byPercent / 100;
		salary += raise;
	}

}



分享到:
评论

相关推荐

    Java 2核心技术,卷I:基础知识(第七版).part1

    Java 2核心技术,卷I:基础知识(第七版) <br> ...对象与类 4.1 面向对象程序设计概述 4.2 使用现有类 4.3 有户自定义类 4.4 静态域与静态方法 4.5 方法参数 …… <br> <br> ...

    Java 2核心技术,卷I:基础知识(第七版).part2

    Java 2核心技术,卷I:基础知识(第七版) <br> ...对象与类 4.1 面向对象程序设计概述 4.2 使用现有类 4.3 有户自定义类 4.4 静态域与静态方法 4.5 方法参数 …… <br> <br> ...

    Java 2核心技术,卷I:基础知识(第七版).part3

    Java 2核心技术,卷I:基础知识(第七版) <br> ...对象与类 4.1 面向对象程序设计概述 4.2 使用现有类 4.3 有户自定义类 4.4 静态域与静态方法 4.5 方法参数 …… <br> <br> ...

    PSCAD4.5建模与仿真(新手必看).doc

    需要对所有元件的参数(包括元件名称-名称不可重复)进行设定,方法:双击元件符号,弹出对话窗口,修改其中参数,按“OK”退出。一些元件,例如:电源、变压器等,需要设置的参数较多,因此,对话窗口中含有多个副...

    大地测量计算工具集4.5

    七参数模型参数(布尔莎模型)求解;不同ITRF之间的坐标变换(ITRF2005到ITRF2000,ITRF2000到其它各种ITRF,ITRF到PZ90等);不同ITRF之间的速度变换;点位坐标的参考历元变换;时间系统的转换(GPS时、格利高里历...

    第四章最小二乘参数辨识方法及原理.ppt

    "第四章最小二乘参数辨识方法及原理.ppt" 本节内容主要讲述了最小二乘参数辨识方法的基本原理、常用的最小二乘辨识方法、递推最小二乘法、数据饱和现象、适应性算法、广义最小二乘法、递推广义最小二乘法、增广矩...

    机器学习-C4.5-决策树-算法实现-C4.5决策树算法的Python代码和数据样本.zip

    决策树算法是机器学习中用于分类和回归任务的一种非常流行的方法,C4.5作为其中一种改进的算法,提供了有效处理连续和离散属性的能力。本资源提供了C4.5决策树算法的Python实现,以及用于训练和测试该模型的数据样本...

    使用ADOBE FLASH BUILDER 4.5

    使用ADOBE FLASH BUILDER 4.5 目录 第 1 章: 关于 Flash Builder 可使用 Flash Builder 构建的应用程序 用于加快应用程序开发速度的功能 用于运行和调试项目的功能 Flash Builder 版本 Flash Builder 配置 ...

    非参数统计(陈希孺著)2012中科大出版社【高清扫描,带书签】

    非参数统计是数理统计学中一个体系博大、理论精深且富有实用价值的分支,《非参数统计》对非参数统计的理论和方法进行了系统的论述,内容上有一定的广度和深度,经典全面,反映了本学科的现代面貌,语言表达具有简洁...

    WebService Studio .net Framework 4.5

    用户可以选择任何方法并提供所需的输入参数。在单击Invoke时,SOAP请求被发送到服务器,响应被解析以显示返回值。 这个工具是为了让web服务实现者测试他们的web服务,而不必编写客户端代码。这也可以用于访问WSDL...

    Python3.5常见内置方法参数用法实例详解

    本文实例讲述了Python3.5常见内置方法参数用法。分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/functions.html?highlight=built#ascii 1、abs(x):返回一个...

    数字音乐制作工具 PreSonus Studio One Pro 4.5.5.54904 x64 中文多语免费版.zip

    “开始”页面提供了启动创作过程所需的内容 – 打开项目,设置参数以及检查更新和提示。从那里开始,歌曲页面全部是关于录制,整理,编辑和混合您的音乐与一整套虚拟乐器,效果和突破性的安排工具。然后,在“项目...

    GFS2.4×4.5型高效高频煤泥脱水筛的研究

    首先简要介绍了GFS2.4×4.5高频煤泥脱水筛的工作原理和主要技术特征,然后分析了参数选择的方法和设计结构的特点,最后对主要参数进行了设计计算,同时也对筛机进行了动态特性分析。

    现代信号谱分析

    4.5 Pisarenko和MUSIC方法 4.6 最小模方法 4.7 ESPRIT方法 4.8 前向-后向方法 4.9 补充内容 4.10 习题 第5章 滤波器组方法 5.1 引言 5.2 周期图的滤波器组解释 5.3 改进的滤波器组方法 5.4 ...

    优质文档 十大经典数据挖掘算法R语言实现 共28页.pdf

    #Something about the data mining 数据挖掘(Data mining):是数据库知识发现(英语:Knowledge-Discovery ...EM 是一种概率模型参数的算 法;PageRank 是一种链接分析的算法,主要用于图数据里,对结点重要性进行排名.

    Hillstone山石网科安全网关命令手册_4.5R3

    本手册为Hillstone山石网科多核安全网关命令手册。详细描述StoneOS中用到的所有命令,具体内容有命令的格式、使用方法、参数、默认值和使用实例等。

    Delphi 6 程序员代码编写标准指南

    3.3.2 形式参数 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 参数的排序 3.3.2.4 常量参数 3.3.2.5 名称的冲突 3.4 变量 3.4.1 变量的命名和格式 3.4.2 局部变量 3.4.3 全局变量的使用 3.5 类型 3.5.1 大写约定 ...

    基于机器学习方法虚拟筛选Syk的抑制剂.pdf

    本研究采用C4.5决策树与随机森林(Random Forest,RF)两种机器学习方法分别对Syk抑制剂与非抑制剂建立模型,经过对比,RF具有更好的预测精度。然后,采用RF模型对Syk抑制剂进行虚拟筛选,从ZINC数据库筛选得到潜在...

Global site tag (gtag.js) - Google Analytics