考察对象引用,方法传参问题 这里要想到C里面的指针Java方法传参,如果是对象的话,传的是对象的引用,什么是对象的引用?我的理解有点类似于C的指针 简单说一下Java中,对象和基本变量在内存中的存储8大基本对象一般存在堆区,存的是变量的实际值 对象,引用有一块专门的区域存储,我记得是栈,这里不敢乱说,但可以肯定的是不是堆区有了以上两点基础知识,我们来分析一下这道题在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型
public A 是A类的构造函数,你每次new A() 的时候都会调用构造函数,即调用public A(),构造函数里面你定义了2个StringBuffer,然后做了一个连接字符串的操作,最终得到你的结果。这里面楼主主要得知道对象的引用,这里面定义了两个对象,四个引用,sb1,a引用指向对象值“sb1”;sb2,b引用指向对象值“sb2”,当执行myfunction()方法时,将sb2的值追加到了sb1的值上,所以这时候的sb1,a引用指向对象值就是“sb1sb2”;sb2,b引用指向对象值仍然是“sb2”,当执行到a = b 时,把引用a指向了对象值为“sb2”的对象,所以打印a.toString()结果应该是“sb2”,但是sb1和sb2 引用的指向一直都没变,所以结果楼主所示。
在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型好的 解释很清楚,明白了,
在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 答案就是这样:sb2 sb1,sb2
在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型好的 解释很清楚,明白了,
在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 答案就是这样:sb2 sb1,sb2 答案应该是这样啊,我的意思是可能你以为你的代码答案应该是这样
在构造函数里,创建了两个对象 sb1和sb2,请注意,这里是对象 myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本 相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b 然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题) 前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2" 因此sb1这个对象内容变了,a的指向变了 于是有了这个结果修改把代码改成 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 我猜你以为的答案会是这样 sb2 sb1,sb2这里需要说明一下,虽然String不是基本类型 但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */ public A() { // StringBuffer sb1 = new StringBuffer("sb1"); // StringBuffer sb2 = new StringBuffer("sb2"); String sb1 = "sb1"; String sb2 = "sb2"; myfunction(sb1,sb2); System.out.println(sb1+","+sb2); } // public void myfunction(StringBuffer a,StringBuffer b){ // a.append(b); // a = b; // System.out.println(a.toString()); // } public void myfunction(String a,String b){ a = a + b ; a = b; System.out.println(a.toString()); } public static void main(String[] args) { new A(); } } 答案就是这样:sb2 sb1,sb2 答案应该是这样啊,我的意思是可能你以为你的代码答案应该是这样很透彻的解释,接分
撸主要搞明白,引用是值传递的,所以a = b 丝毫不会改变sb1,但是a.append(b)却改变了sb1,好好想想吧
sb1sb2,sb2
a = b;这一行有没有不会影响main方法中的sb1,sb2;
你先看一下StringBuffer,a.append(b)没有生成新的对象,是在原对象的基础上进行操作的;
对这个 分析分析,,,代码中不是a=b,为什么只是局部起作用。。,而那个 a.append(b)起作用了
这里要想到C里面的指针Java方法传参,如果是对象的话,传的是对象的引用,什么是对象的引用?我的理解有点类似于C的指针
简单说一下Java中,对象和基本变量在内存中的存储8大基本对象一般存在堆区,存的是变量的实际值
对象,引用有一块专门的区域存储,我记得是栈,这里不敢乱说,但可以肯定的是不是堆区有了以上两点基础知识,我们来分析一下这道题在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型
那么变量 的值,就是个引用。
引用,怎么产生,只要不是基本数据类型,就会自动产生引用。还是习惯习惯,看书看书,
在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型好的 解释很清楚,明白了,
但是有一点,,
堆区存放的是new出来的对象和类中方法的名,
代码区存放的是 类中方法的具体代码,
栈区存放的是 对象引用和基本数据类型,
数据区,存放的是 数据常量和String类型的字符串记得是这样的
能把堆和栈说清的,应该是JVM那的层次的吧。
反正我只知道引用这说法。
在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 答案就是这样:sb2
sb1,sb2
上面有两段代码,一个是用的是 stringbuffered的 append方法实现的,另一个是通过string的+实现的,,怎么结果不一样,麻烦分析一下
在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型好的 解释很清楚,明白了,
但是有一点,,
堆区存放的是new出来的对象和类中方法的名,
代码区存放的是 类中方法的具体代码,
栈区存放的是 对象引用和基本数据类型,
数据区,存放的是 数据常量和String类型的字符串记得是这样的涨知识了,一直以为基本对象是放在堆里
需要好好看看编译原理来~~~谢谢指正~
在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 答案就是这样:sb2
sb1,sb2
答案应该是这样啊,我的意思是可能你以为你的代码答案应该是这样
在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果修改把代码改成
public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 我猜你以为的答案会是这样
sb2
sb1,sb2这里需要说明一下,虽然String不是基本类型
但在Java里可以当成基本类型来用,有基本类型的一些性质,也是存在堆区,但它不是基本类型还有就是 public class A {
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
} 答案就是这样:sb2
sb1,sb2
答案应该是这样啊,我的意思是可能你以为你的代码答案应该是这样很透彻的解释,接分