想问一下这个为什么输出还是ABB,那个y=x没有作用吗(语言-java)

img


pubic class test {
 pubLic static void mb ( StringBuffer x , StringBuffer Y )
 X . append ( y );

 public static void main ( String [] args ){ //args :{}
 StringBuffer a = new StringBuffer (" A ");// a :" AB "
 StringBuffer b = new StringBUffer (" B "); //b :" B " 
mb ( a , b );
System . out . println ( a +","+ b );

 //a :" AB " b :" B "

想问一下这个为什么输出还是ABB,那个y=x没有作用吗?

这里涉及到Java值传递的问题
图一

img

图二

img

图三

img

图三的1,2步对应的是图一的1
图三的3对应的是图二的2

说明
在mb方法中的形参x,y对应实参a,b,这里是x和y指向a和b的内存地址。x的修改内容可以改a的内容,但是y=x只是把x的指向地址复制给y,即x和y同时指向a地址,但是b的内容没有没有发生任何改变。所以控制台输出依然是ABB


package test2;

public class ThreadTest {
//    public static void main(String[] args) {
//        ThreadSale threadSale = new ThreadSale();
//        Thread t1 = new Thread(threadSale,"第1售票窗口");
//        Thread t2 = new Thread(threadSale,"第2售票窗口");
//        Thread t3 = new Thread(threadSale,"第3售票窗口");
//        Thread t4 = new Thread(threadSale,"第4售票窗口");
//        t1.start();
//        t2.start();
//        t3.start();
//        t4.start();
//    }

    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        mb(a,b);
        b = a;
        System.out.println(a + "," + b);
    }

    public static void mb(StringBuffer x,StringBuffer y) {
        x.append(y);
    }
}

class ThreadSale implements Runnable {
    int tickets = 120;
    @Override
    public synchronized void run() {
        while (true) {
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                + "售票机第" + tickets-- + "号;");
            }else {
                System.exit(0);
            }
        }
    }
}

它是对传进来的StringBuffer赋值,是对引用赋值,指向新的数据,但原来的数据是没有改动的,所以还是 B。

y=x;起作用了,但是并没有附加到主方法b里面

public static void mb(StringBuffer X, StringBuffer Y){
   X.append(Y);//append是把值附加到X和a
   Y=X;//这个只是把x值加到Y了,并没有附加到b
   System.out.println("X:"+X);
   System.out.println("Y:"+Y);
}
public static void main(String [] args){
  StringBuffer a = new StringBuffer("A");// a :" AB "
  StringBuffer b = new StringBuffer("B"); //b :" B "
  mb (a,b);
  System.out.println ( a +","+ b );
}

结果

img

这正是是字符串常量与字符串变量的区别
首先StringBuffere是String的增强,
https://blog.csdn.net/fengyun14/article/details/1199751?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-1199751-blog-121180265.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-1199751-blog-121180265.pc_relevant_antiscanv2&utm_relevant_index=2
你把a.append(b);这个结果拼接了,肯定是AB。
那么我们来分析一下,为什么b输出B呢?
是因为StringBuffer b)这里是局部变量,你把b=a;这里确实等于AB,但是这个变量的范围是这个方法,方法结束,变量消失,带不出去的。

img