(博客内容来自于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 方法参数-值调用,引用调用问题的更多相关文章

  1. java方法参数传递方式只有----值传递!

    在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中, 在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影 ...

  2. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

  3. 辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  4. Java方法的定义以及调用、方法重载、可变参数以及递归

    目录 何谓方法 方法的定义及调用 方法的定义 方法调用 方法重载 命令行传参 可变参数 递归 何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于 ...

  5. 【转】java方法参数传递方式--按值传递、引用传递

    java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...

  6. java方法参数

    Java程序设计语言总是采用值调用.也就是说,方法得到的是所有参数的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容. 基本类型参数 1)X被初始化为percent值的一个拷贝: 2)X被乘以 ...

  7. Java方法参数的传递方式

    程序设计语言中,将参数传递给方法(或函数)有两种方法.按值传递(call by value)表示方法接受的是调用者提供的值:按引用调用(call by reference)表示方法接受的是调用者提供的 ...

  8. java方法的理解、调用栈与异常处理

    一.流程分支 If/else :基于boolean值的双分支 Switch:基于数字(整数.char.byte.枚举).字符串 类型的多分支 Int month =5; Switch 二.方法meth ...

  9. Java 方法重载与引用数组类型

    1.方法重载  1)方法的签名 方法的签名包含方法名和参数列表 一个类中,不可以有两个方法的签名完全相同,即一个类中不能有两个方法的方法名和参数列表都一样. public class Test{ pu ...

随机推荐

  1. 关闭Eclipse中自动弹出console的功能

    当我们使用Eclipse编写代码的时候,一般都会使界面最大化,如果这时tomcat服务器处在运行的状态,那么当后台有打印内容,比如日志输出,代码程序报错输出时,console就会自动弹出,很不方便. ...

  2. 程序设计模式 —— State 状态模式

    我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...

  3. MyBatis中的特殊符号[20160713]

    今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力. 今天主要记录一下MyBatis中的特殊符号的问题,这个问题 ...

  4. [PHP] 读取大文件并显示

    使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据 PHP代码: <?php class Test{ //日志路径 const LOG_PATH=& ...

  5. innerHTML和outerHTML有什么区别

    一.区别:1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签.2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身. 二.例子1: & ...

  6. 初学者对WAMP服务器的设置

    服务器设置 在wamp/bin/apache/Apache###/conf/httpd.conf文件中设置 根文件夹 修改documentroot和directory两项 保存后重启服务 404返回值 ...

  7. ASP.NET MVC的请求生命周期

    我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...

  8. javascript --- 词法分析

    JavaScript代码自上而下执行,但是在js代码执行前,会首先进行词法分析,所以事实上,js运行要分为词法分析和执行两个阶段. 词法分析主要分为三步: 第一步: 分析形参: 第二步: 分析变量声明 ...

  9. Form.action传值问题

    通过浏览器地址栏输入url并通过?传递参数请求资源时,?后面的参数叫做 "查询字符串",会触发后台Servlet的doGet(),因为通过浏览器地址栏直接访问的方式是GET方式. ...

  10. angularjs 的ng-bind-html过滤了内容的style

    1.不使用ng-bind-html,使用trustAs() trustAsHtml(value) =   trustAs($sce.HTML, value) trustAsJs(value)  =   ...