当前位置: 技术问答>java相关
一个有关String的问题
来源: 互联网 发布时间:2015-04-20
本文导语: class TestCommon{ static String s1 = "111"; static StringBuffer s2= new StringBuffer("111") ; void m1( String s ) { s = s.concat("hello"); } void m2( StringBuffer s ) { s = s.append( "hello") ; } public static void main(String...
class TestCommon{
static String s1 = "111";
static StringBuffer s2= new StringBuffer("111") ;
void m1( String s ) {
s = s.concat("hello");
}
void m2( StringBuffer s ) {
s = s.append( "hello") ;
}
public static void main(String args[]) {
TestCommon app=new TestCommon();
app.m1(s1);
app.m2(s2);
System.out.println("s1="+s1);
System.out.println ("s2="+s2);
}
}
s1的输出是“111”
s2的输出是“111hello”
为什么s1的输出还是“111”呢?
static String s1 = "111";
static StringBuffer s2= new StringBuffer("111") ;
void m1( String s ) {
s = s.concat("hello");
}
void m2( StringBuffer s ) {
s = s.append( "hello") ;
}
public static void main(String args[]) {
TestCommon app=new TestCommon();
app.m1(s1);
app.m2(s2);
System.out.println("s1="+s1);
System.out.println ("s2="+s2);
}
}
s1的输出是“111”
s2的输出是“111hello”
为什么s1的输出还是“111”呢?
|
Java中的参数传递是和C++不一样的。
对于这样的函数
class A{
void fun1(A o)
{
o = null;
}
public static void main(String args[])
{
A a = new A();
A b = new B();
a.fun1(b);
这里执行完了,b!=null;
}
}
但如果这个传递是C++的引用传递的话
结果就不一样的,b=null;
所以,Java对象参数传递类似于C里面的指针值传递。
fun1(void *p)
{
p = NULL;//这是无效的;
*p = 1;//这是有效的
}
也就是说,在Java中你能改变作为参数传入的对象实体的成员,
但不能改变对像实体的本身。
也就是说第一个帖子中的那两个函数的赋值运算是没有什么用处的。
对于这样的函数
class A{
void fun1(A o)
{
o = null;
}
public static void main(String args[])
{
A a = new A();
A b = new B();
a.fun1(b);
这里执行完了,b!=null;
}
}
但如果这个传递是C++的引用传递的话
结果就不一样的,b=null;
所以,Java对象参数传递类似于C里面的指针值传递。
fun1(void *p)
{
p = NULL;//这是无效的;
*p = 1;//这是有效的
}
也就是说,在Java中你能改变作为参数传入的对象实体的成员,
但不能改变对像实体的本身。
也就是说第一个帖子中的那两个函数的赋值运算是没有什么用处的。
|
虫子说的很正确,String.concat()创建的是一个新的String,也就是说它返回的是一个新的字符串对象,对原对象没有影响。看看下面的程序可能对你有所帮助。
class TestCommon{
static String s1 = "111";
static StringBuffer s2 = new StringBuffer("111") ;
String m1( String s ) {
s = s.concat("hello");
return s;
}
void m2( StringBuffer s ) {
s = s.append( "hello") ;
}
public static void main(String args[]) {
TestCommon app = new TestCommon();
String ss = app.m1(s1);
app.m2(s2);
System.out.println("s1 = "+s1);
System.out.println("ss = "+ss);
System.out.println ("s2 = "+s2);
}
}
class TestCommon{
static String s1 = "111";
static StringBuffer s2 = new StringBuffer("111") ;
String m1( String s ) {
s = s.concat("hello");
return s;
}
void m2( StringBuffer s ) {
s = s.append( "hello") ;
}
public static void main(String args[]) {
TestCommon app = new TestCommon();
String ss = app.m1(s1);
app.m2(s2);
System.out.println("s1 = "+s1);
System.out.println("ss = "+ss);
System.out.println ("s2 = "+s2);
}
}
|
static String s1 = "111";
static StringBuffer s2= new StringBuffer("111") ;
void m1( String s ) {
s = s.concat("hello");
}
s1 向方法m1中的s传递一个值,而s的值的改变不会影响s1的值.
s2 向方法m2中的s是按引用传递的,所以s 的值的改变会影响s2的值.
static StringBuffer s2= new StringBuffer("111") ;
void m1( String s ) {
s = s.concat("hello");
}
s1 向方法m1中的s传递一个值,而s的值的改变不会影响s1的值.
s2 向方法m2中的s是按引用传递的,所以s 的值的改变会影响s2的值.