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';
}
}
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';
}
}
应该这样,没有测试
很明显你把引数的作用搞错了。
引数只是指向一块内存,当Str="test ok";其实是把str指向test ok,当函数调用玩。str就被释放了
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';
}
}
基本类型int,char,float等和c语言一样。
object的引数则很大区别。
自己看看书吧,最基本知识
如果是初学,建议不要学。java太垃圾了,因为免费才受到老板喜欢。其实一无是处。
str = "test ok"; 的str 和String str = new String ("good");
中的str是指乡向同一个地址,怎么可能不改变String str = new String ("good");的值呢?
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
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 |
| |
| |
| |
--------------
开了这个帖子了!我更觉得结果该为:test ok
所以参数引用相当于C里面的指针传递。
OVER。呵呵,
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}这里的str的范围是在{}里面,而String str = new String("good"); 的str应该是this.str
这是两个不同的变量,如果你改称:this.str="test ok";试试看小弟刚学java不知道我说的对不,请高手指点。
String对象与一般的Object对象不同。
例如:String str = "abc"; 一旦你创建了该对象,你就不能再通过str去改变其值。在String值要经常改变的情况下,我们要用StringBuffer就是这个原因。
在你的change函数中,str="test ok" 实际上是新创建了一个String对象,说到底就是两个str的内存地址不一样,你可以通过调用hashcode来测试。
两次输出结果不一样就是由于两个str不一样造成的。
在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把
其实java中只有by value没有by reference,str="test ok";这是创建了个新的对象,我想你是这点没有理解到!这也是String特别的地方!
其结果是将str指向了新的对象,这个对象和"good"这个对象是两个不同的对象。
chr[0]='g';其实是改的外面的数组对象本身,所以结果为g
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
如果你c好,你把c的内存处理机制给大伙讲讲
下面的例子你运行一下自己思考一下/* */
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;
}
}
楼上说 java 两个内存操作的 还逻辑上的那位到底懂不懂啊,还把final拿出来,你知道final修饰的是什么就说能变不能变,自己理解的浅就不要埋怨语言本身,java如果都和C++一样那还是java么,
如果你c好,你把c的内存处理机制给大伙讲讲嘿嘿,我当然知道final,书上讲的不全面。
考你一下,知道final,finally,finalize的区别吗?或许我没有说清楚,实质上ch[]指向的内容改变了。而str没有改变。因为引数特性,main的str和ch的指向始终没有改变。在方法中,ch[]因为操作的是基本内存,所以内容改变了。而str是先在常量池建立一个新的字符串对象。然后让方法中的ch[]指向他。因此内容没有改变。
如果这样再理解不了,你就看书去吧。慢慢就了解了。
打错了。是让str指向他
对String比较要用.equals的
java参数传递的是引用的拷贝!!你的str和this.str已经不一样了
对String比较要用.equals的
因为引数都是拷贝的.他不会影响到原引用.所以要看在调用的函数体内,原指向的内存是否被改写.我的意思就是这个.