问一个Java的基础问题

[复制链接]
查看11 | 回复8 | 2007-8-6 15:19:02 | 显示全部楼层 |阅读模式
class MyClass {
public static void main(

String argsp[] ) String str = "OK";

func( str );

System.out.println( str );
}
static void func ( String str ) {

str = str.replace( 'O', 'P' );
}
}
问题是最后结果,输出什么?
答案是 OK
我很不理解,有人说Thinking in Java里面有讲解,但是
我怎么找也没找到,在这里请教一下,谢谢
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
刚才去运行了下你这个程序,有错误,等我改好了告诉了
但是我也有点不明白,就是replace 那里的 O 转换成P 了
应该打印出PK,等我再仔细看看
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
class MyClass {

public static void main(String argsp[] ){

String str = "OK";

str = func( str );

System.out.println( str );

}

static String func ( String str ){

str = str.replace('O', 'P' );

return str;

}
}
void是无返回值的,你的意思是调用func(str)后返回各String类型的值吧?
我把你的void func(str) 改成了 Sting func(str)
并且加了str = func( str );因为func(str) 返回的是一个String类型的值

请楼主参考~~
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
最初由 su3737 发布
[B]class MyClass {

public static void main(String argsp[] ){

String str = "OK";

str = func( str );

System.out.println( str );

}

static String func ( String str ){

str = str.replace('O', 'P' );

return str;

}
}
void是无返回值的,你的意思是调用func(str)后返回各String类型的值吧?
我把你的void func(str) 改成了 Sting func(str)
并且加了str = func( str );因为func(str) 返回的是一个String类型的值

请楼主参考~~ [/B]

楼主说的不是你这个意思,这个问题的确很奇怪,最可能的原因是作用域,replace这个函数绝对是起作用的
class MyClass {
public static void main(String[] args) {

String s = "OK";

func(s);

System.out.println(s);
}
static void func (String str) {

str = str.replace("O", "P");

//System.out.println(str);
}
}
复制代码
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
我似乎了解了一点
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
这是String类常量性质的表现,String对象是不可变的,用replace('o' 'p')是产生了另外一个string对象,原来的str对象的引用没有变化(方法都是值传递),当然引用指向的string对象也没有变。
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
以前我犯了个错误,java中一切都是pass by value, 包括reference,下面用张图表示一下,看是否会清楚些,可参考Core Java I中有关章节
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
class MyClass {
public static void main(String argsp[])
{
func( str );
System.out.println( str );
}
static String str = "OK";
static void func (Stringstr1 )
{
str1 = str1.replace( 'O', 'P' );
System.out.println("in func "+str1);
}
}
用上面那个CLASS来理解就比较容易了。
其实,FUNC里调用的STRING和外面的STR是不同的。
回复

使用道具 举报

千问 | 2007-8-6 15:19:02 | 显示全部楼层
这个在think in java里确实是解释了的,对象作为参数,在方法体内会有一个句炳的复制副本,具体到这里又改变了该副本的指向!! frenchletter 的图解很准确!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行