zoukankan      html  css  js  c++  java
  • 有关java调用方法参数传递的分析

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

    相信做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

  • 相关阅读:
    星球居民突破 1800 人!
    测试数据管理
    解决InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade
    Warning: file_get_contents(): open_basedir restriction in effect. File(/proc/uptime) is not within the allowed path(s)解决方法
    Java终止线程的三种方式
    线程中断interrupt
    Linux 开启防火墙 避免非干系人误操作的处理
    Oracle12c 快速启动命令设置
    Docker 运行 Redis Rabbitmq seata-server ftp 的简单办法
    mysql8 CentOS7 简要安装说明
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3245922.html
Copyright © 2011-2022 走看看