zoukankan      html  css  js  c++  java
  • String作为输出型参数时获取不到值

    有时候在一个方法中,我们需要返回多个字符串,而又不想将这些字段包成一个类。此时就需要使用输出型参数。

    但是如果将输出型参数的类型声明为String,那么调用该方法后,是获取不到我们想要的值的。

    测试代码如下:

    public class StringTest {
    	
    	public static void main(String[] args){
    		StringTest st = new StringTest();
    		String a = "a";
    		String b = "b";
    		st.testReferenceParam(a, b);
    		System.out.println("a="+a + "; b=" + b );
    	}
    	
    	public void testReferenceParam(String A, String B){
    		A = "This is A";
    		B = "This is B";
    		return;
    	}
    }
    

      输入为:

    a=a; b=b
    

      这是什么原因呢?

    这需要从内存原理,以及引用传参方面来解释。

    内存原理:一个String指向的对象(此处排除常量字符串)是在堆上存在的,String变量则在栈上存在。当将其作为参数传递给方法时,方法会再声明一个字符串变量,这个变量指向的对象和传进来的参数指向的是同一个对象。如果在方法执行中,该对象里的内容发生了变化,则方法执行过后,该变化保留了下来,此时可以看到原实参指向的对象内容缺失变了。但如果在方法执行过程中,只是将形参指向的对象换了,那么新对象的内容不会更新到实参指向的对象的。上述例子就是后者这种情况。

    怎么才能获取到想要的值呢?

    不要改变形参指向的对象,而只改变对象的内容。由于String是内容不可变字符串,所以要改用StringBuilder或StringBuffer。

    改后代码:

    public class StringTest {
    	
    	public static void main(String[] args){
    		StringTest st = new StringTest();
    		StringBuilder a = new StringBuilder("a");
    		StringBuilder b = new StringBuilder("b");
    		st.testReferenceParam(a, b);
    		System.out.println("a="+a + "; b=" + b );
    	}
    	
    	public void testReferenceParam(StringBuilder A, StringBuilder B){
    		A.append(" This is A");
    		B.append(" This is B");
    		return;
    	}
    }
    

      输出:

    a=a This is A; b=b This is B
    

      

      以上纯属个人理解,如有错误,敬请指正。

  • 相关阅读:
    5.2-5.3
    5.1封装
    阅读《构建之法》 5-7章
    做汉堡
    阅读《构建之法》1-5章
    结对 四则运算
    回答
    读后感
    提问*2
    提问1
  • 原文地址:https://www.cnblogs.com/Anidot/p/6985131.html
Copyright © 2011-2022 走看看