zoukankan      html  css  js  c++  java
  • 关于Java方法的参数

    刚好看到C++的函数这块,说C++中除了引用类型的形参,其他都是实参的副本(个人总结)。

    隐约记得Java中方法的参数也是这么回事,于是手动测试一番。

    结果

    Java中方法的参数都是值传递,哪怕是引用类型,传递的也是引用本身的副本(指向同一个对象)。

    个人以为,将Java中的引用类型的变量看作指针更容易理解。

    测试代码

    import org.junit.Test;
    
    public class TestFunction {
    
        @Test
        public void testInt(){
            int a = 3;
            int b = 4;
            swap(a, b);
            System.out.println(a + "---" + b);
        }
    
        @Test
        public void testString(){
            String a = "hehe";
            String b = "what";
            swap(a, b);
            System.out.println(a + "---" + b);
        }
    
        @Test
        public void testInner(){
            Inner a=new Inner();
            a.setAge(10);
            Inner b=new Inner();
            b.setAge(20);
    
            swap(a,b);
            System.out.println(a.getAge() + "---" + b.getAge());
    
        }
    
        /**
         * 基本类型,是值传递,所以不会修改原对象
         *
         * @param a
         * @param b
         */
        public void swap(int a, int b){
            a += b;
            b = a - b;
            a -= b;
        }
    
        /**
         * 字符串也是值传递
         * @param a
         * @param b
         */
        public void swap(String a, String b){
            String tmp = a;
            a = b;
            b = tmp;
        }
    
        /**
         * 引用,传递的也是引用本身,类似地址。所以只是副本,不会影响原值。
         * @param a
         * @param b
         */
        public void swap(Inner a, Inner b){
            Inner tmp=a;
            a=b;
            b=tmp;
        }
    
        /**
         * inner class
         */
        class Inner{
            private int age;
            public void setAge(int age){
                this.age=age;
            }
            public int getAge(){
                return this.age;
            }
        }
    }

    补充

    绝大多数时候,我们使用的都是传入对象(引用类型)的成员,所以不会涉及这个问题。因为引用的副本仍然指向同一个对象。

  • 相关阅读:
    【Spring】 AOP Base
    【Offer】[20] 【表示数值的字符串】
    【Offer】[19] 【字符串匹配】
    【设计模式】代理模式
    【LeetCode】[0002] 【两数之和】
    【Offer】[18-1] 【在O(1)时间内删除链表节点】
    【Offer】[18-2] 【删除链表中重复的节点】
    【Offer】[17] 【打印1到最大的n位数】
    【Offer】[16] 【数值的整数次方】
    python_内置函数
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5583054.html
Copyright © 2011-2022 走看看