java 方法参数-值调用,引用调用问题
(博客内容来自于core java卷一)
1. xx调用:程序设计语言中方法参数的传递方式:
引用调用(call by reference):表示方法接收的是调用者提供的变量地址。
值调用(call by value):表示方法接收的是调用者提供的值。
命名调用(call by name):已经成为历史。
2. Java使用值调用,而且只有值调用。也就是说方法得到的是参数值的一个拷贝,并不是参数值本身,所以,方法不能修改传递给它的的任何参数变量本身。
看下面代码:
public class test {
public static void main(String[] args) {
int percent = 10;
tripleValue(percent);
System.out.println(percent);
}
public static void tripleValue(int x){
x = x * 3;
}
}
输出:10
可以看到,无论怎样调用这个方法,执行之后,persent的值还是10。具体执行过程:
① x被初始化为persent的一个拷贝(也就是10)。这时x是x,persent是persent,只不过值相同。
② x被乘以3后等于30。但是persent仍然是10。
③ 这个方法结束后,参数变量x不再使用。
3. 然而,方法参数共有两种类型:基本数据类型(数字,布尔值);对象引用。
一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了。这时,方法得到一个对象引用的拷贝。对象引用和其拷贝,同时引用着一个对象。
看下面代码:
public class test {
public static void main(String[] args) {
Circle c = new Circle();
c.r = 1;
bigger(c);
System.out.println(c.r);
}
public static void bigger(Circle c2){
C2.r = c2.r+3;
}
}
class Circle{
int r;
}
输出:4
具体执行过程:
① c2被初始化为c值的拷贝,这个值是一个对象的引用。
② bigger方法应用于这个对象引用。所以,c2和c同时引用的那个Circle对象的r值就增加了3。
③ 方法结束后,参数变量c2不再使用。c继续引用这个r值已经增加了3的Circle对象。
4.很多程序设计语言(特别是c++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员认为java程序设计语言对对象采用的是引用调用,实际上这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例,来详细阐述一下这个问题。
首先编写一个交换两个圆对象的方法:
public static void swap(Circle x,Circle y){
Circle temp = x;
x = y;
y = temp;
}
如果java程序设计语言对对象采用的是引用调用的话,这个方法应该能够实现交换数据的效果:
Circle a = new Circle(1);
Circle b = new Circle(2);
swap(a,b);
System.out.println(a.r);
System.out.println(b.r);
输出:
1
2
但是,方法并没有改变存储在变量a和b中的对象引用。Swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝,a和b中的对象引用并没有变化。最终,白费力气,在方法结束时参数变量x和y被丢弃了。这个过程说明:java对对象采用的不是引用调用,而是值传递。
5.总结:
(1)一个方法不能修改一个基本数据类型的参数(即数值型和布尔类型值)。
(2)一个方法可以通过对象参数对其引用的对象状态进行操控。
(3)一个方法不能让对象参数引用一个新的对象。
注意:c++有值调用和引用调用。引用参数标有&符号。例如,可以轻松低实现void swap(Circle& a,Circle& b)方法,实现修改它们的引用参数的目的。
java 方法参数-值调用,引用调用问题的更多相关文章
- java方法参数传递方式只有----值传递!
在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中, 在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影 ...
- java方法强制传递引用参数(做为返回值),改变被传递参数值。
Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...
- 辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
- Java方法的定义以及调用、方法重载、可变参数以及递归
目录 何谓方法 方法的定义及调用 方法的定义 方法调用 方法重载 命令行传参 可变参数 递归 何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于 ...
- 【转】java方法参数传递方式--按值传递、引用传递
java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...
- java方法参数
Java程序设计语言总是采用值调用.也就是说,方法得到的是所有参数的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容. 基本类型参数 1)X被初始化为percent值的一个拷贝: 2)X被乘以 ...
- Java方法参数的传递方式
程序设计语言中,将参数传递给方法(或函数)有两种方法.按值传递(call by value)表示方法接受的是调用者提供的值:按引用调用(call by reference)表示方法接受的是调用者提供的 ...
- java方法的理解、调用栈与异常处理
一.流程分支 If/else :基于boolean值的双分支 Switch:基于数字(整数.char.byte.枚举).字符串 类型的多分支 Int month =5; Switch 二.方法meth ...
- Java 方法重载与引用数组类型
1.方法重载 1)方法的签名 方法的签名包含方法名和参数列表 一个类中,不可以有两个方法的签名完全相同,即一个类中不能有两个方法的方法名和参数列表都一样. public class Test{ pu ...
随机推荐
- 小白学Linux(五)--VI/VIM编辑器
我们操作文件,终究离不开编辑文件,对文件内容的编辑,Linux系统下,我们通常使用VI/VIM来编辑文件.VI是每个Linux都会自带的文本编辑器,VIM是VI的增强版,可能有些发行版本没有自带,可以 ...
- lnmp+phpmyadmin配置与出现问题
本博客归moka同学(新浪微博:moka同学)本人亲自整理,如有使用,请加链接注明出处. lnmp 安装完全后,配置phpmyadmin .其访问方式为 http://202.18.400.379/p ...
- 《JAVA与模式》之组合模式
定义(GoF<设计模式>): 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 及角色: 1.Component 是组合中的对象声明接口,在适 ...
- Android 提供的一系列辅助系统开发工具
除了软件本身的代码之外,Android 还提供了一系列工具来辅助系统开发,这些主要的工具包括: aapt(AndroidAssetPackagingTool):用于建立zip兼容的包(zip.jar. ...
- Linux 学习手记(4):Linux系统常用Shell命令
日期时间 date命令:显示当前时间日期 date -u # 显示格林威治(UTC)事件 date +%Y-%m-%d # 格式显示日期 date -s '20:25:25' # 修改系统时间,需要使 ...
- 怎样让js循环重复执行过程
setInterval(function(){ cc();},60000);setInterval是每隔一分钟就执行一次方法体,主要特点是循环不断的执行.而setTimeout是执行一次就不会继续执行 ...
- ASP.NET页面动态添加js脚本
有时我们需要生成自己的JavaScript代码并在运行时动态添加到页面,接下来我们来看一下如何将生成的JavaScript代码动态添加到ASP.NET页面. 为了添加脚本,要将自定义的脚本在一个字符串 ...
- location对象及history对象
history对象 location 是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能.事实上,location 对象是很特别的一个对象,因为它既是windo ...
- Log4net中的调错
在使用log4net时,感觉最麻烦的就是配置文件了,为了使用方便,我不得不先准备好一个完整的配置文件方案,测试了输出到文本.控制台.windows事件.SQL Server数据库都没有问题,但输出到o ...
- DevExpress.XtraGrid.Views 设置指定行的背景颜色 .
如需要将指定行的背景设置颜色,可参考以下示例 1.事件:CustomDrawCell 2.示例: private void gridView1_CustomDrawCell(object sender ...