• JAVA值传递和引用传递 以及 实参是否改变


    八大数据类型和String 在进行传递的时候  不会改变.

    八大数据类型

    public class parameterValue {    //值传递
        public static void main(String[] args) {
            int x = 10;
            method(x);
            System.out.println(x);
        }
        public static void method(int mx) {
            mx = 20;
        }
        /**
         * 在栈内存中申请mx  这时候  x 和mx 存储的值 是一样的,但是x和mx的地址是不一样的,mx=20;并不影响x的值.
         * 八大基本数据类型都是这个吊样.
         * */
    }

    String

    package oneDay;
    
    public class RefDemo1 {
        public static void main(String[] args) {
            String nameString = "小飞";
            
            String yuanString;
            yuanString = new String("asd");
            System.out.println(yuanString);
            
            method(nameString);
            System.out.println(nameString);
        }
        private static void method(String name) {
            name = "小贝"; // 相当于 name = new String(); name = "小贝";
            // 相当于 指向改变
            /**
             * 简单解释一下. String nameString 相当于在栈空间中申请了一块空间,用于存储引用地址(此时没有引用地址为空).
             * nameString = 小飞; 相当于 nameString = new String("小飞"); 这时候 在堆内存申请了一块空间用于存储 实际的值.
             * 也就是说 在method 这个方法 当中. 形参 String name 相当于 String name; name = nameString; 这时候  name和nameString在栈内存中
             * 存储的引用地址  是一样的 ,  当时当
             * name = "小贝";的时候  该代码 相当于 name = new String("小贝"); 在堆内存中新申请了一块空间, 将该地址 赋予name  这时候 name和nameString在栈内存中
             * 存储的值(引用地址) 就又不一样了. 所以 八大基本数据类型和String 一样   在 方法中进行传递的时候  不会改变自身的值, 但是 类 可以改变自身的值..         
             * * */
        }
    }

    package oneDay;
    
    
    public class RefDemo {        //引用传递
        public static void main(String[] args) {
            Duck duckYuan = new Duck();        
            System.out.println("Duck age = "+duckYuan.age);
            method(duckYuan);        
            System.out.println("Duck age = "+duckYuan.age);
        }
        private static void method(Duck duck) { 
            duck.age = 5; 
        }
        /**
         * Duck duckYuan = new Duck(); 在栈内存和堆内存中申请空间,并将 堆内存的地址 放入栈内存中,以待使用. 
         * 形参中的 Duck duck 在栈内存中申请空间,并将上面的duckYuan内存储的堆内存的地址放入duck中,
         * 然后  方法内的duck.age = 5; 这时候的duck和duckYuan栈内存地址虽然不同,但期内存储的堆内存的地址 都是指向同一块堆内存地址的,这样就改变了原来的值.
         * 
         * */
    }
    
    class Duck{
        int age = 2; //省略封装
    }

    为什么   String也是类但是   不会改变呢? 总结一下:

    在两个方法当中

    name = "小贝";
    duck.age = 5;
    /**
    * 八大基本上数据类型属于值传递.
    * String以及其余的引用数据类型属于引用传递.
    * 八大基本数据类型和String 不会改变其内容 , 其余的会改变内容.
    * 八大基本数据类型: 新申请了栈内存空间, 在函数内的 所有操作都是针对形参的, 无论怎样搞, 都不会改变实参的值.
    * String: 新申请了占内存空间, 但是改变String的值的时候, 会将新的堆内存的空间地址放到栈内存当中, 这样的话原本的栈内存和堆内存都没有发生变化, 所以String也不会变.
    * 对于普通的引用数据类型, 在调用函数的时候: 新申请的形参存储的是原本引用数据类型的堆内存的地址, 在修改数据的时候会改变原来堆内存的内容. 和String的栈内存堆内存都不变相比, 这里改变了堆内存的内容, 所以值发生变化.
    *
    * 可以做一个实验, 在普通引用数据类型做形参的时候, 不改变堆内存的内容, 先改变一下 栈内存的地址, 这样也不会发生变化.
    */
  • 相关阅读:
    Mysql:Group Replication & Replication
    使用winsw包装服务将nginx包装为Windows服务
    Nginx的一些常用配置
    在ASP.NET Core 2.0中使用Facebook进行身份验证
    展现层实现增删改查
    ABP创建应用服务
    ABP领域层定义仓储并实现
    ABP领域层创建实体
    通过模板创建一个ABP项目
    Android UI组件:布局管理器
  • 原文地址:https://www.cnblogs.com/A-FM/p/5627927.html
Copyright © 2020-2023  润新知