String和基本包装类作为参数在传递问题

转载 2018年04月17日 18:20:46

String和基本包装类作为参数在传递问题

public class ReferenceDemo {

    public static void StringReference(){
        String a = new String("abc");
        String b = a;
        changeString(b);
        System.out.println("a: "+a);
        System.out.println("b: "+ b);
    }

    public static void changeString(String str){
        // str = "23232"; 同样的结果
        str = new String("abcd");
    }

    public static void IntegerReference(){
        Integer c = new Integer("1");
        Integer d = c;
        changeInteger(d);
        System.out.println("c: "+c);
        System.out.println("d: "+ d);
    }

    public static void changeInteger(Integer d){
        d = new Integer("12");
    }

    public static void main(String[] args) {
        StringReference();
        IntegerReference();
    }

}

结果:

a: abc
b: abc
c: 1
d: 1

可以发现b没有变成abcd,而且d也没有变成12, 明明是引用类型,什么变化,网上说String类型和基本包装类作为参数传递时会变成值传递,还有一种说法是String和基本包装类构造函数里的value是final类型的,我们知道,被final修饰的变量一旦初始化后就不能被修改。

//Integer.java源码
public final class Integer extends Number implements Comparable<Integer> {
    private final int value;
    public Integer(String s) throws NumberFormatException {
            this.value = parseInt(s, 10);
    }
}

//String源码
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
    public String() {
           this.value = new char[0];
    }
 }

自己实现一个实体类PlainString:

public class PlainString {

    private String value;

    public PlainString(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value;
    }
}

测试:

public class ReferenceDemo {

    public static void plainString(){
        PlainString ps = new PlainString("aaa");
        PlainString pls = ps;
        changePlainString(pls);
        System.out.println("ps: "+ps);
        System.out.println("pls: "+pls);
    }

    public static void changePlainString(PlainString ps){
//        ps = new PlainString("bbb"); //注释1
        ps.setValue("bbb");    //注释2
    }


    public static void main(String[] args) {
        plainString();
    }

}

结果:

//打开注释1
ps: aaa
pls: aaa

//打开注释2
ps: bbb
pls: bbb

如果将PlainString中变成value用final修饰,那么就不能有setter方法了

public class PlainString {

    private final String value;

    public PlainString(String value) {
        this.value = value;
    }


    @Override
    public String toString() {
        return this.value;
    }
}

结果:

ps: aaa
pls: aaa

猜测: 刚开始初始对象时在堆上分配内存地址A,在非setter方法赋值的change*方法,实际上是在堆上分配了一块不同于初始化对象的内在地址B,当出change*方法体后,GC会回收B的内存地址,相当于没有改变;但使用setter方法的change*方法,实际上是在同一块内存地址A上修改了value,因此会对指向该内存地址的句柄产生影响

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

原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类...
  • wuya814070935
  • wuya814070935
  • 2015-10-19 15:39:03
  • 3965

Java包装类传递形参

Java包装类传递形参先看一段程序:package com.interview.bytelearn;/** * 原题链接:https://www.nowcoder.com/questionTermi...
  • Next_Second
  • Next_Second
  • 2017-08-22 09:52:43
  • 527

java的String类型作为参数传递

转载:http://blog.csdn.net/pony_maggie/article/details/44120045 看一段代码: [java] view ...
  • sujiacheng_123
  • sujiacheng_123
  • 2016-11-29 15:01:45
  • 813

Java基本数据类型、包装类与String类之间的转换

一、基本数据类型与包装类之间的转换: import org.junit.Test; public class MainTest { /** * 基本数据类型与包装类之间的转换 ...
  • u013453970
  • u013453970
  • 2015-08-11 09:06:36
  • 3738

基本数据类型、包装类、String类型之间的相互转换

@Test public void test2(){ //基本数据类型、包装类-->到String类型的转换,调用String类型的静态方法valueOf()即可 int i1 = 12; Strin...
  • XF777
  • XF777
  • 2017-05-22 17:21:14
  • 627

java中的String作为参数引起的一些研究

昨天在做一个关于函数参数传递的题目: 下面有关java按值传递和引用传递,说法错误的是? A. char类型的传递属于按值传递 B. Array类型的传递属于按引用传递 C. 用户自定义...
  • zxdfc
  • zxdfc
  • 2015-09-29 14:41:29
  • 1266

C++中string做函数传递参数的危险问题

许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、dat...
  • gyymen
  • gyymen
  • 2016-12-09 08:33:10
  • 4684

基本数据类型:8种基本类型、对应的包装类、引用数据类型及与String 之间的转换。

/**  *   基本数据类型 : 8种基本类型  *   对应的包装类      引用数据类型     及 与 String 之间的转换。  * @author Administrator  *  ...
  • prefectjava
  • prefectjava
  • 2016-03-31 10:56:27
  • 1508

String和StringBuffer类型数据进行参数传递问题

1.String和StringBuffer做为形参传递 通常参数传递有两种:                 基本类型:不会影响实际参数的值                 引用类型:会影响实际参数的...
  • xiaofei__
  • xiaofei__
  • 2016-11-02 14:36:21
  • 1717
收藏助手
不良信息举报
您举报文章:String和基本包装类作为参数在传递问题
举报原因:
原因补充:

(最多只允许输入30个字)