首先:程序是可以运行的,当执行java name EDF 后,结果就是EDF。 有人说:public static String setName(String name)这传进来的是一个引用啊,引用的值一旦改变了,那就变了呀,在C里面引用就是这个意思,所以想不通,是不是Java里面的引用和C里面的不一样啊?大家可能会这样想; 还有人会说问题出在这条语句上面:return name = "ABC";这条语句是先返回name=“EDF”;然后name=“ABC”; 我的看法:从入口讲起,String name = args[0];这条语句是实例化了一个String的对象name,也可以说是一个引用,相当于c里面的指针,然后让他指向内存中的一片空间,那个空间是内存分配出来存放用户输入的字符串对象的。setName(name);第二句的是调用类方法setName,传递的参数就是引用name,没有错,说白了,就是用户输入的字符串对象传递过去了,public static String setName(String name),这个类方法为了存放这个传递过来的字符串对象,就又实例化了一个String的引用name,相当于c语言里面的行参和实参的区别,然后执行return name = "ABC";这条语句可以分为两条语句:name=“ABC”;return name;第一条语句name=“ABC”;是让setName(String name)方法里面的name这个引用指向了另外一片内存空间,而这个另外的内存空间里面存放的就是“ABC”,(这里并没有改变原来存放“EDF”的那片内存空间),return name;返回了一个字符串对象,也就是存放“ABC”的那片空间的引用;但是这个并没有影响main方法里面的那个引用name,也没有改变存放“EDF”的那片内存空间;那么当print那个引用的时候,就还是指向那个“EDF”的那个name引用。 大家可以编译运行一下下面两个程序,看看结果:1. public class name {
public static String setName(String name){ return name = "ABC"; } public static void main(String [] args){ String name = args[0]; name = setName(name); System.out.println(name); } }2. public class name {
public static String setName(String name){ System.out.println("2 "+name); name = "ABC"; System.out.println("3 "+name); return name; } public static void main(String [] args){ String name = args[0]; System.out.println("1 "+name); setName(name); System.out.println("4 "+name); } }相信比较之后你就可以得出结论了!
还有这个程序,看看结果,你会有更惊人的发现 public class ChangeName { public static void setName(String[] name){ name[0] = "ABC"; }
public static void main(String [] args){ String[] name =new String[1]; name[0]= args[0]; setName(name); System.out.println(name[0]); } }
return name = "ABC";我想如果你用return name; 那肯定就是abc了吧.
public class name {
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name);
name T=new name();
T.setName(name);
System.out.println(name);
}
}
运行javac name EDF
结果如下:EDF
EDF
public class name {
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name);
name T=new name();
T.setName(name);
System.out.println(name);
}
}
运行javac name EDF
结果如下:EDF
EDF
这样行么?
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name); //这样就是ABC了,你不是希望打印出name对象的值把,幸好这里并没有建立名字为name的name对象
//要不非晕死
//name T=new name(); 也只是建立一个名字为T的name对象 System.out.println(setName(name));
name=setName(name);
System.out.println(name);
}
}
public class name {
//更改setName函数
public static void setName(String name){
name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name);
}
}
运行java name EDF
答案:EDF
你两次用set方法
但是仅改变了对象中的name
回到main方法后没有调用对象中的name
当然不会出现你要的结果啦
public class name {
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name);
name T=new name();
/*T.setName(name);
System.out.println(name);*/
System.out.println(T.setName(name));
}
}
运行java name EDF
运行结果:EDF
ABC
public class name {
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
setName(name);
System.out.println(name);
name T=new name();
/*T.setName(name);
System.out.println(name);*/
==========================================
System.out.println(T.setName(name));
这一句并不是你说你把name变量的值改变了,而是你返回的值是ABC,也就是T.setName(name)的值,但是并没有改变MAIN方法里的变量name,这点希望你要搞清楚,这里的name和setName方法里的name没有半点关系
下面这个程序希望对你有帮助
public class ChangeName {
public static void setName(String[] name){
name[0] = "ABC";
}
public static void main(String [] args){
String[] name =new String[1];
name[0]= args[0];
setName(namea);
System.out.println(name[0]);
}
}
==========================================
}
}
运行java name EDF
运行结果:EDF
ABC
System.out.println(T.setName(name));
这一句并不是你说你把name变量的值改变了,而是你返回的值是ABC,也就是T.setName(name)的值,但是并没有改变MAIN方法里的变量name,这点希望你要搞清楚,这里的name和setName方法里的name没有半点关系
-----------------------------------------------------
呵呵,其实我已经搞清楚了,不过还是谢谢你。
难道你是 febchen() 的马甲?
the statement simply return a "ABC", and no operation is done on the string name.
并没有对main()里面的name做任何的改变也不是midlet说的那样,return name="ABC";是执行了的
把setName改成这样看看就知道了
public static String setName(String name){
name = "ABC";
return name;
}
public test() {
demo myDemo=new demo();
stringTest(myDemo);
System.out.println(myDemo.testString);
String strTest=new String("oldValue");
stringTest2(strTest);
System.out.println(strTest);
}
class demo{
String testString=new String("oldValue");
}
static void stringTest(demo testDemo){
testDemo.testString="newValue";
}
static void stringTest2(String str){
str="newValue";
}
public static void main(String[] args){
test testInst=new test();
}
}
例如:
String str1 = "abc";
str1 = "bcd";
当你执行第二条语句时,此时的str1对象已经不是原先的那个str1对象了,str1被重新分配的存贮空间!
先返回name=DEF,然后再赋值name="ABC"
public static String setName(String name){
return name = "ABC";
}
以上name仅仅是个参数而已,在setName里定义的是参数name,跟main函数里的name完全是两回事
String str1;
声明一个String类型的str1,str1指向空(null)
str1 = "abc";
"abc"对应一块内存,现在的str1仅仅是指向该块内存,就是对"abc"得引用
str1 = "cdf";
此时的str1只是指向了另外一个块内存。
由此可以说明一下java中 = 操作符:他只是把变量指向的内存的地址改变了
方法调用:
callFunction(str1){
str1 = "another value";
}
在方法调用的过程其实是:
复制了一个str1,和原来的str1指向同一块内存
所以函数中的str1和原来的其实是不同的,只是一开始指向同一块内存
对其使用 = 操作符,只是让复制得到的str1指向另外一块内存,而原来的str1并没有改变不知道这样说大家能不能明白?
值传递
数组传给name的值自然就是DEF了。
有人说:public static String setName(String name)这传进来的是一个引用啊,引用的值一旦改变了,那就变了呀,在C里面引用就是这个意思,所以想不通,是不是Java里面的引用和C里面的不一样啊?大家可能会这样想;
还有人会说问题出在这条语句上面:return name = "ABC";这条语句是先返回name=“EDF”;然后name=“ABC”;
我的看法:从入口讲起,String name = args[0];这条语句是实例化了一个String的对象name,也可以说是一个引用,相当于c里面的指针,然后让他指向内存中的一片空间,那个空间是内存分配出来存放用户输入的字符串对象的。setName(name);第二句的是调用类方法setName,传递的参数就是引用name,没有错,说白了,就是用户输入的字符串对象传递过去了,public static String setName(String name),这个类方法为了存放这个传递过来的字符串对象,就又实例化了一个String的引用name,相当于c语言里面的行参和实参的区别,然后执行return name = "ABC";这条语句可以分为两条语句:name=“ABC”;return name;第一条语句name=“ABC”;是让setName(String name)方法里面的name这个引用指向了另外一片内存空间,而这个另外的内存空间里面存放的就是“ABC”,(这里并没有改变原来存放“EDF”的那片内存空间),return name;返回了一个字符串对象,也就是存放“ABC”的那片空间的引用;但是这个并没有影响main方法里面的那个引用name,也没有改变存放“EDF”的那片内存空间;那么当print那个引用的时候,就还是指向那个“EDF”的那个name引用。
大家可以编译运行一下下面两个程序,看看结果:1.
public class name {
public static String setName(String name){
return name = "ABC";
}
public static void main(String [] args){
String name = args[0];
name = setName(name);
System.out.println(name);
}
}2.
public class name {
public static String setName(String name){
System.out.println("2 "+name);
name = "ABC";
System.out.println("3 "+name);
return name;
}
public static void main(String [] args){
String name = args[0];
System.out.println("1 "+name);
setName(name);
System.out.println("4 "+name);
}
}相信比较之后你就可以得出结论了!
public class ChangeName {
public static void setName(String[] name){
name[0] = "ABC";
}
public static void main(String [] args){
String[] name =new String[1];
name[0]= args[0];
setName(name);
System.out.println(name[0]);
}
}
那肯定就是abc了吧.
System.out.println(name);中name是全局变量。而setName中只是局部变量。
name T=new name();
System.out.println(T.setName(name));
也是你自己写的啊,你是用同样的名称混淆了自己,反法声明中的参数变量名,如果与全局变量重名会发生什么?是不是局部变量对全局的替代?算作覆盖吧!不过有现场保护的,System.out.println(T.setName(name));这句你输出的是方法的返回值,不是全局变量name的值,你自己把自己绕进去了:)
君习java一年,提出这样的问题,时还没有搞清楚java编程的实质,另一方面,在一些概念上模糊不清啊!好好抓一下基础,尤其是变量作用域和生存期部分!