基础,但很怪的问题

rainboy20024 2005-06-28 12:09:29
public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
}
...全文
423 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrb52 2005-07-01
  • 打赏
  • 举报
回复
回复人: photoshop(developer) ( ) 信誉:99 2005-06-29 15:34:00 得分: 0


java参数传递的是引用的拷贝!!你的str和this.str已经不一样了
对String比较要用.equals的


因为引数都是拷贝的.他不会影响到原引用.所以要看在调用的函数体内,原指向的内存是否被改写.我的意思就是这个.
xiangqianchong 2005-06-29
  • 打赏
  • 举报
回复
嘿嘿,挺热闹的嘛!学习!
yangbc 2005-06-29
  • 打赏
  • 举报
回复
java参数传递的是引用的拷贝
下面的例子你运行一下自己思考一下

/*

*/
package _test;


public class Example
{
String str = new String("good");

static char[] ch = { 'a', 'b', 'c' };

public static void main(String args[])
{
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);

ex.change2(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);

char[] ch2 = { '1', '2', '3' };
ch=ch2;
System.out.println(ex.ch);

}

public void change(String str, char ch[])
{
str = "test ok";
ch[0] = 'g';//参数为数组的可以被改变
}

public void change2(String str, char ch[])
{
str = "test ok";

char[] ch2 = { '1', '2', '3' };
ch =ch2;
}
}
yangbc 2005-06-29
  • 打赏
  • 举报
回复
楼上说 java 两个内存操作的 还逻辑上的那位到底懂不懂啊,还把final拿出来,你知道final修饰的是什么就说能变不能变,自己理解的浅就不要埋怨语言本身,java如果都和C++一样那还是java么,
如果你c好,你把c的内存处理机制给大伙讲讲
photoshop 2005-06-29
  • 打赏
  • 举报
回复
java参数传递的是引用的拷贝!!你的str和this.str已经不一样了
对String比较要用.equals的
xmadan 2005-06-29
  • 打赏
  • 举报
回复
对像按引用传递
hrb52 2005-06-29
  • 打赏
  • 举报
回复
然后让方法中的ch[]指向他
打错了。是让str指向他
hrb52 2005-06-29
  • 打赏
  • 举报
回复
回复人: yangbc(土豆块) ( ) 信誉:100 2005-6-29 5:41:48 得分: 0

楼上说 java 两个内存操作的 还逻辑上的那位到底懂不懂啊,还把final拿出来,你知道final修饰的是什么就说能变不能变,自己理解的浅就不要埋怨语言本身,java如果都和C++一样那还是java么,
如果你c好,你把c的内存处理机制给大伙讲讲

嘿嘿,我当然知道final,书上讲的不全面。
考你一下,知道final,finally,finalize的区别吗?

或许我没有说清楚,实质上ch[]指向的内容改变了。而str没有改变。因为引数特性,main的str和ch的指向始终没有改变。在方法中,ch[]因为操作的是基本内存,所以内容改变了。而str是先在常量池建立一个新的字符串对象。然后让方法中的ch[]指向他。因此内容没有改变。
如果这样再理解不了,你就看书去吧。慢慢就了解了。

hrb52 2005-06-28
  • 打赏
  • 举报
回复
纠正一下
基本类型int,char,float等和c语言一样。
object的引数则很大区别。
自己看看书吧,最基本知识
  • 打赏
  • 举报
回复
你的输入法有问题 把下面的代码拷贝再试试:
public class Example{

String str = new String("good");

char [] ch = {'a','b','c'};

public static void main(String args[]){
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.println(ex.str + "end");
System.out.println(ex.ch);
}
public void change(String str, char ch[]){
str = "test ok";
ch[0] = 'g';
}
}
hrb52 2005-06-28
  • 打赏
  • 举报
回复
good and abc
应该这样,没有测试
很明显你把引数的作用搞错了。
引数只是指向一块内存,当Str="test ok";其实是把str指向test ok,当函数调用玩。str就被释放了
说好不能打脸 2005-06-28
  • 打赏
  • 举报
回复
楼主这样写不太规范,你的两个变量应该封装的。而且有个地方你没有理解到:对数组的传值是传的地址。再说你这段代码还没法编译,单词都写错了
class Example{
private String str=new String("good");
private char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.getStr(),ex.getCh());
System.out.print(ex.getStr()+" and ");
System.out.print(ex.getCh());
}

public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}

/**
* @return Returns the ch.
*/
public char[] getCh() {
return ch;
}
/**
* @param ch The ch to set.
*/
public void setCh(char[] ch) {
this.ch = ch;
}
/**
* @return Returns the str.
*/
public String getStr() {
return str;
}
/**
* @param str The str to set.
*/
public void setStr(String str) {
this.str = str;
}
}
运行结果:good and gbc
rainboy20024 2005-06-28
  • 打赏
  • 举报
回复
xiangqianchong(向前冲) :
开了这个帖子了!我更觉得结果该为:test ok
xiangqianchong 2005-06-28
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4007/4007791.xml?temp=.7784235
rainboy20024 2005-06-28
  • 打赏
  • 举报
回复
public class Example{

String str = new String("good");

char [] ch = {'a','b','c'};

public static void main(String args[]){
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.println(ex.str + "end");
System.out.println(ex.ch);
}
public void change(String y, char ch[]){
y= "test ok";
ch[0] = 'g';
}
}



我觉得是这样的啊:
_____________
| |
y-------| |
| |
str-----|test ok |
| |
| |
| |
--------------
rainboy20024 2005-06-28
  • 打赏
  • 举报
回复
import java.util.*;
public class Test {

String str="good";
char[]ch={'a','b','c'};
static T t = new T();
public static void main(String args[]){
Test ex=new Test ();
ex.change(ex.str,ex.ch,t);
System.out.print(ex.str+" and ");
System.out.print(ex.ch );
System.out.println(" " + t.i);




}
public void change(String st,char ch[],T tt){
System.out.println("----------------------------------");
System.out.println(st);
System.out.println(ch);
System.out.println("---------------------------");
tt.i=65;
st="test ok";
ch[0]='g';
}
}

class T{
int i=10;
}


结果为什么是这样的呢?
----------------------------------
good
abc
---------------------------
good and gbc 65
rainboy20024 2005-06-28
  • 打赏
  • 举报
回复
我知道是reference的作用!就是不明白,为什么ch[]数组内容被改了?
str = "test ok"; 的str 和String str = new String ("good");
中的str是指乡向同一个地址,怎么可能不改变String str = new String ("good");的值呢?

MARS.nEIL 2005-06-28
  • 打赏
  • 举报
回复
学习.
xiangqianchong 2005-06-28
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4007/4007791.xml?temp=.7784235
其实java中只有by value没有by reference,

str="test ok";这是创建了个新的对象,我想你是这点没有理解到!这也是String特别的地方!
其结果是将str指向了新的对象,这个对象和"good"这个对象是两个不同的对象。
chr[0]='g';其实是改的外面的数组对象本身,所以结果为g
hrb52 2005-06-28
  • 打赏
  • 举报
回复
ch[]本身也是一个索引,他指向char,当你对他修改的时候,他像c中的指针的作用一样。而char是基本类型,所以让修改了。
在java中数组就是一个指针。

另外对于String
String a="aa"和String a=new String("aa")是完全不同的感念。
你不信试验一下。
String a="a";
String b="a";
if(a==b) out.println("true");

String a=new String("aa")
String b=new String("aa")
if(a==b) out.println("true");
java这些东西太混浇了。换c++或者.net把
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧