这个问题好多文章都讲过了,在此本人补充一下,加深理解,有不足之处请指教。

相信做java开发同学们都知道,调用方法传递参数时,不论是基本类还是引用类型,

java都是值传递,不存在引用传递(称引用传递,只是便于理解,不过看到我下面的例子,就要注意了)。

先看这里例子:预期输出结果是什么?

public class Test4
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Domain domain = new Domain();
        domain.setName("test01");
        System.out.println("调用chenge方法之前:name=" + domain.getName());
       
        chenge(domain);
       
        System.out.println("调用chenge方法之后:name=" + domain.getName());
       
        /****************************************************/
        domain.setName("www01");
       
        System.out.println("调用chenge2方法之前:name=" + domain.getName());
       
        chenge2(domain);
       
        System.out.println("调用chenge2方法之后:name=" + domain.getName());
    }
   
    public static void chenge(Domain domain)
    {
        domain.setName("test02");
    }
   
    public static void chenge2(Domain domain)
    {
        Domain domain2 = new Domain();
        domain2.setName("wwww02");
        domain = domain2;
    }
}

class Domain
{
    private String name;
   
    public String getName()
    {
        return name;
    }
   
    public void setName(String name)
    {
        this.name = name;
    }
   
}

<br>

实际输出结果:

调用chenge方法之前:name=test01
调用chenge方法之后:name=test02
调用chenge2方法之前:name=www01
调用chenge2方法之后:name=www01

-------------------------------------------------------------------------------------

分析:

代码中方法chenge和chenge2都是应用类型作为入参的;

对于调用方法chenge的结果很好理解;对于调用方法chenge2就要好好分析了。

因为:java中调用方法时的入参都是值传递(不管是基本类型还是引用类型)

所谓的值传递,按照jdk的介绍,本质是变量名的拷贝被传到方法中,比如 基本类型变量、引用类型变量,在传递到方法中时,

都是该变量的一个拷贝。基本类型的值都保存在栈用中(实际栈的值是共享的),调用方法后不会影响原来的值。

(1)针对例子中的chenge方法:chenge(domain);  这里的变量domain会有一个拷贝传到chenge方法体内,这个拷贝变量同样与domain指向之前的对象。

方法chenge中的  domain.setName("test02") 语句,实际修改的是拷贝变量指向的对象,由于变量domain与拷贝变量同时指向一个对象,

变相的修改了domain的指向对象。

因此打印结果为:

调用chenge方法之前:name=test01
调用chenge方法之后:name=test02

(2)由(1)的分析,就好理解chenge2方法了。

chenge2方法是将拷贝变量指向了另一个新的对象,不影响原来的对象,

因此打印结果为:

调用chenge2方法之前:name=www01
调用chenge2方法之后:name=www01

有关java调用方法参数传递的分析的更多相关文章

  1. Java split方法源码分析

    Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...

  2. Java调用方法参数究竟是传值还是传址?

    之前阅读<Head First Java>的时候,记得里面有提到过,Java在调用方法,传递参数的时候,采用的是pass-by-copy的方法,传递一份内容的拷贝,即传值.举一个最简单的例 ...

  3. java关于方法参数传递的相关问题讨论

    我们知道,java中定义变量的目的有两个: 1.防止被垃圾回收机制回收,毕竟如果没有明确指向真实物理内存的'代号'很大可能会被java垃圾回收机制当作垃圾回收. 2.便于引用,方便处理. packag ...

  4. Selenium Grid的Java调用方法

    java -jar selenium-server-standalone-.jar -role hub explorer http://192.168.1.173:4444/grid/console ...

  5. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  6. JAVA调用阿里云短信接口

    官方文档:https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.626.2cef6220yxh5l7 jar ...

  7. java中方法的参数传递机制

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

  8. 【Java基础】12、java中方法的参数传递机制

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

  9. java 调用webservice的各种方法总结

    java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...

随机推荐

  1. Google Chrome Resize Plugin

    https://chrome.google.com/webstore/detail/window-resizer/kkelicaakdanhinjdeammmilcgefonfh

  2. ZH奶酪:PHP抓取网页方法总结

    From:http://www.jb51.net/article/24343.htm 在做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过ht ...

  3. Windows 之 可以Ping通服务器但无法使用服务器连接的共享打印机

    故障现象:一个公司内部局域网中,一台电脑可以Ping通服务器,但无法使用服务器连接的共享打印机. 故障分析与排除:根据故障现象分析,由于客户端可以Ping通服务器,说明网络连接正常,故障可能是由客户端 ...

  4. linux2.6.30.4内核移植(4)——完善串口驱动

    在内核里支持两个串口,也就是芯片的UART0和UART1,而UART2的驱动是针对红外接口的,而不是串口驱动,这里将其修改为串口驱动. 一.修改内核源码arch/arm/mach-s3c2440/ma ...

  5. JDK5.0 特性-线程同步装置之Semaphore

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...

  6. 安装MySQL-python报错:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory或者 build\lib.win-amd64-2.7\_mysql.pyd : fatal error LNK1120: 56 unresolved externa

    解决办法1: 直接下载MySQL-python-1.2.5.win-amd64/32-py2.7.exe,点击安装 此处要注意自己安装的Python和MySQL版本是64位还是32位,否则在进行安装M ...

  7. 算法笔记_229:有理数的循环节(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 1/7 = 0.142857142... 是个无限循环小数.任何有理数都可以表示为无限循环小数的形式. 本题目要求即是:给出一个数字的循环小数表示法 ...

  8. java json与map互相转换(一)

      java json与map互相转换(一) CreationTime--2018年7月16日 Author:Marydon 1.准备工作 所需jar包:json-20180130.jar impor ...

  9. Linux之压缩与解压缩

    一.解压缩: tar –xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2 //解压 tar. ...

  10. django之 文件上传功能(缺陷:无法改存放目录)

    百度云盘:django之 文件上传功能(缺陷:无法改存放目录)