zoukankan      html  css  js  c++  java
  • 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的栈内存堆内存都不变相比, 这里改变了堆内存的内容, 所以值发生变化.
    *
    * 可以做一个实验, 在普通引用数据类型做形参的时候, 不改变堆内存的内容, 先改变一下 栈内存的地址, 这样也不会发生变化.
    */
  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/A-FM/p/5627927.html
Copyright © 2011-2022 走看看