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


    java的方法参数传递方式有两种,按值传递和引用传递

    1.按值传递

    参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式

    代码片段1:

    public class Test {
     
        public static void main(String[] args) {
            int a = 5;
            fun(a);
            System.out.println(a);// 输出结果为5
        }
     
        private static void fun(int a) {
            a += 1;
        }
    }

    2.引用传递

    参数类型为引用类型,参数传递的过程采用拷贝引用的方式

    代码片段2:

    public class Test {
     
        public static void main(String[] args) {
            A a = new A(5);
            fun(a);
            System.out.println(a.a);// 输出结果为6
        }
     
        private static void fun(A a) {
            a.a += 1;
        }
     
        static class A {
            public int a;
     
            public A(int a) {
                this.a = a;
            }
        }
    }

    结论:按值传递,不会改变原来的值,引用传递,会改变引用对象的值

    再看下面这种情况:

    代码片段3:

    public class Test {
     
        public static void main(String[] args) {
            Integer a = 5;
            fun(a);
            System.out.println(a);// 输出结果为5
        }
     
        private static void fun(Integer a) {
            a += 1;
        }
     
    }

    这里明明是引用传递,为什么没有改变对象的值呢?

    这里其实使用了基本数据类型封装类的自动装箱功能。

    Integer a = 5,编译后实际为Integer a = Integer.valueOf(5),查看Integer的源码,并没有改变原对象的值,只是将其引用指向了另一个对象。


    代码片段3中的过程可以用下图来表示:

    直接改变了栈帧中的地址,指向另一个对象,所以并没有改变原来的值。

    --------------------- 本文来自 zhenge1990 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zhenge1990/article/details/78897166?utm_source=copy 

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/modou/p/9752816.html
Copyright © 2020-2023  润新知