zoukankan      html  css  js  c++  java
  • Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

    Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

    Java中的值传递和引用传递

    原理知识:

    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.

    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。

    如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。


    String和包装类是什么类型传递这个问题,可能很多人都没有去细想过,下面我就给点我自己的见解。

    public class Test {
    
        public static void test1(Integer num){
            num = new Integer(5);
        }
    
        public static void test2(String str){
            str.replace("1", "4");
        }
    
        public static void main(String[] args) {
    
            Integer num = new Integer(1);
            test1(num);
            // 输出结果为1
            System.out.println(num.intValue());
    
            String str = new String("123");
            test2(str);
            // 输出结果为123
            System.out.println(str);
        }
    
    }
    分析:
    
        上述程序很容易让人误以为String类型和包装类型是值传递。
    
    其实我们认真想一下:
    
        String类型和包装类型都是对象类型,所以必然是引用传递。
        但是由于String类和包装类都没有提供value对应的setter方法,我们无法改变其内容,所以导致我们看起来好像是值传递。



    基本类型的数组对象,可以作为载体带回返回值
    package com.dfs.util;
    
    public class Test5 {
    
        public static void main(String[] args) {
            int[] a = {1,2,3};
            test(a);
            for(int item : a) {
                System.out.println(item);
            }
        }
        
        private static void test(int[] a) {
            a[1] = 100;
        }
    }

    结果:

    1
    100
    3


  • 相关阅读:
    《代码大全》阅读心得一
    vi列模式
    以指定的概率/机会获取元素
    自用VIM配置
    优雅的Javascript
    关于遮罩层
    CSS3属性BorderRadius详解[圆角]
    CSS3属性boxshadow详解[盒子阴影]
    CSS3文字特效
    Css3 Animation详解
  • 原文地址:https://www.cnblogs.com/duanxz/p/3040139.html
Copyright © 2011-2022 走看看