关于参数的问题,大家来讨论一下 不是说java中方法的参数是 值传递 吗,为什么 数组 和 容器类 会例外呢,什么原因(底层实现)大家说说啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 值传递的意思是把变量的内容传过去。对于基础类型的参数,起变量存储的就是它的值,例如对于int a=5,其内容就是5.但像数组之类的,或者对象,其变量的内容是存储所在的内存地址,作为参数传过去的时候,传的就是地址的值 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。 简单数据类型是值传递,如int,boolean等复杂数据类型都是引用传递,如由object继承而来的所有类型 那你意思是对象都是以用传递了;那么string对象是对象的例外还是怎么回事啊 string类型是怎么回事呢,是因为它是final的还是因为他的存储方式啊 我记得好像在哪看过说java中的参数的传递与 c c++ 是不同的,那么除了c系列可以传指针参数之外 java与他们还有其他什么不同的吗 基本类型是值传递,对象是引用传递例如:void method1(int i) //值传递void method2(Object o) //引用传递 String对象也是引用传递的。 (一) 从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JAVA中,你只能通过在形参上调用方法来修改实参所引用的那个对象,却修改不了实参本身(不能使它引用到另个对象),如: void f(ArrayList list) { list = new ArrayList(); //不影响外边的实参。 } 所以从这个角度,JAVA中根本就没有“引用传递”(不像C#中,真的有引用传递,只需要加个ref或out关键字,就不仅可以修改实参所引用的对象,还能修改实参本身)。 这种说法并非没有道理,因为如果说“通过一个具有索引功能的东西来修改它所索引的那个东西”就算引用传递的话,那么也可以任何语言的参数传递都可进行引用传递了。那你说Windows API中和各种HANDLE算不算“引用传递”呢? (二)在JAVA中,除了内建类型的变量,“一切都是引用”,所以传递一个非内建类型的参数,当然也就是传递一个引用,所以,也可以说JAVA中所有的(除非内建类型)参数传递又“都是引用传递”。 关键是看你怎么理解“引用”和“引用传递 这里最关键的是 String 对象也是对象,比如 void method(String s){s=s+"hello world";}的时候传进来的s在该方法体以外并没有改变,11,12楼这个是怎么解释的呢 String类是Final类,是不可改变的 你在这里void method(String s){s=s+"hello world";}假如你以前的s是指向“china”的地址的拷贝,调用method之后指向的是“china hello world”而以前的字符串变量依然指向的是“china” final类型我试过了,我自定义的final类型是可以改的,(也就是说是所谓“引用”);另外我还试了一下 Boolean 和 Integer 两个包装类的对象,他们都是值传递,其他的包装类就没有一一去试了; 我说的final指的是他的属性是final而非类是final,请看String源代码:public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ /** The value is used for character storage. */ private final char value[];//注意我说的是这个final,她表示什么意思,你知道吧! 怎么说呢,还是不大清楚,如果是因为这里的final而无法改变他的值得话,那我们一般用的s=s+"abc"也是不可以的?我也可能是对你的解释有误解;你再解释一下了 因为String是final,所以s是一个常量,当你对它进行操作时,系统给它重新分配了一块内存空间,而不是再原来的基础上进行操作! public class test {public static void main(String[]args){ String s="china"; //调用之前的s System.out.println(s); //调用method,关键是这里,s指向的常量池中的“china”的地址的拷贝传递给method方法 //在method方法当中,stemp也指向了“china”,在method方法当中,把stemp的指向改变了,但是s的指向没有改变 method(s); //调用之后 System.out.println(s);}public static void method(String stemp){ //testInteger.fl stemp=stemp+"hello";}}刚才没有粘上去。 看我BLOG上的文章:http://blog.csdn.net/Mailbomb/archive/2008/07/19/2677690.aspx 和String不同的类的情况public class test {public static void main(String[]args){myclass bb=new myclass(100);//调用之前System.out.println(bb.getStatue());//调用methodmethod(bb);//调用之后System.out.println(bb.getStatue());}public static void method(myclass xx){ //testInteger.fl xx.setStatue(1000000);}}class myclass { private int statue;//这个时候要注意这个属性成员并不是final,我们可以改变之 myclass(int statue){ this.statue=statue; } public void setStatue(int statue){ this.statue=statue; } public int getStatue(){ return this.statue; }} 我们只能改变的是类的状态,改变的是她的属性成员,对于她原先的引用的地址的值,如果你改变了,原先的地址是不会跟着改变的这就是java中的值的传递,传递引用的地址。 提醒注意,List也是引用传递.一不小心就会骗死人 简单数据类型是值传递,如int,boolean等 复杂数据类型都是引用传递,如由object继承而来的所有类型 这个传引用或者传值就看怎么说了.怎么说都可以自圆其说.比如说传值 对基本数据类型那就是值对于对象就是对象的地址就好像指针.String也是,但是String是不可变的 看前几楼的源码.说传引用的那就是引用啦. 貌似java中只有值传递.对象类型也是值传递,只不过传递进来的是对象的地址引用. 现在主要是说这个 String类和包装类 是怎么弄的啊 对于String是个引用类型,只不多有点特殊,也就是它所指向的内存相当于完整内存就是统一操作,不能单独操作,要是重新赋值,则重新分配内存,也是完整的,原来的内存还在,只不过没了引用成了垃圾内存要避免这样就看看StringBuffer吧,String的升级版 不是说java只有值传递的吗???参数传递的只是一个拷贝,参数返回是这个拷贝销毁 Java中如何获得一个文件夹里边的文件数量(急) 做一个用java检测email是否正确的题目。。 求救,Integer.toString(8,3)是什么意思?看了api,不懂? 数组问题~~Java 数组问题 高手帮我仔细讲讲来·· 想学习排序算法 一个JAVA异常问题 有关JAVA音频播放的问题,请教! 怎样通过3点来画圆弧? jsdkee1.2.1中启动deploytool时发生异常java.lang.NullPointException该怎么办?急 请高手指点!!! JAVA符号占位问题. 笔试题两道,关于"字符串按一行6个字符分割,但不能把一个单词分在两行"
复杂数据类型都是引用传递,如由object继承而来的所有类型
那么string对象是对象的例外还是怎么回事啊
例如:
void method1(int i) //值传递void method2(Object o) //引用传递
String对象也是引用传递的。
void f(ArrayList list) {
list = new ArrayList(); //不影响外边的实参。
}
所以从这个角度,JAVA中根本就没有“引用传递”(不像C#中,真的有引用传递,只需要加个ref或out关键字,就不仅可以修改实参所引用的对象,还能修改实参本身)。
这种说法并非没有道理,因为如果说“通过一个具有索引功能的东西来修改它所索引的那个东西”就算引用传递的话,那么也可以任何语言的参数传递都可进行引用传递了。那你说Windows API中和各种HANDLE算不算“引用传递”呢?
(二)在JAVA中,除了内建类型的变量,“一切都是引用”,所以传递一个非内建类型的参数,当然也就是传递一个引用,所以,也可以说JAVA中所有的(除非内建类型)参数传递又“都是引用传递”。 关键是看你怎么理解“引用”和“引用传递
比如 void method(String s){
s=s+"hello world";
}
的时候传进来的s在该方法体以外并没有改变,11,12楼这个是怎么解释的呢
void method(String s){
s=s+"hello world";
}
假如你以前的s是指向“china”的地址的拷贝,调用method之后指向的是“china hello world”而以前的字符串变量依然指向的是“china”
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];//注意我说的是这个final,她表示什么意思,你知道吧!
public class test {
public static void main(String[]args){
String s="china";
//调用之前的s
System.out.println(s);
//调用method,关键是这里,s指向的常量池中的“china”的地址的拷贝传递给method方法
//在method方法当中,stemp也指向了“china”,在method方法当中,把stemp的指向改变了,但是s的指向没有改变
method(s);
//调用之后
System.out.println(s);
}
public static void method(String stemp){
//testInteger.fl
stemp=stemp+"hello";
}
}刚才没有粘上去。
public static void main(String[]args){
myclass bb=new myclass(100);
//调用之前
System.out.println(bb.getStatue());
//调用method
method(bb);
//调用之后
System.out.println(bb.getStatue());
}
public static void method(myclass xx){
//testInteger.fl
xx.setStatue(1000000);
}
}
class myclass {
private int statue;//这个时候要注意这个属性成员并不是final,我们可以改变之
myclass(int statue){
this.statue=statue;
}
public void setStatue(int statue){
this.statue=statue;
}
public int getStatue(){
return this.statue;
}
}
复杂数据类型都是引用传递,如由object继承而来的所有类型
这个传引用或者传值就看怎么说了.怎么说都可以自圆其说.
比如说传值 对基本数据类型那就是值
对于对象就是对象的地址就好像指针.String也是,但是String是不可变的 看前几楼的源码.说传引用的那就是引用啦.
就是统一操作,不能单独操作,要是重新赋值,则重新分配内存,也是完整的,原来的内存还在,只不过没了引用成了垃圾内存要避免这样就看看StringBuffer吧,String的升级版
参数传递的只是一个拷贝,参数返回是这个拷贝销毁