关于Java中参数传递的问题? 关于Java中参数传递的问题:在网上看到一各说法:"Java只有一种参数传递方式:那就是按值传递,即Java中传递任何东西都是传值。如果传入方法的是基本 类型的东西,你就得到此基本类型的一份拷贝。如果是传递引用,就得到引用的拷贝。"真的是这样吗?对于基本类型是按值传递,我很容易理解.可是对于传递引用,也是按值传递,我就不明白了,传的是什么值???求解! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么把按引用传递看作是按值传递?对于这种问题,还是套用Bruce Eckel的话:这依赖于你如何看待引用,最终你会明白,这个争论并没那么重要。真正重要的是,你要理解,传引用使得(调用者的)对象的修改变得不可预期。请问:"传引用使得(调用者的)对象的修改变得不可预期. "这句话是什么意思??? 我把例子也贴上来,大家可以对照这个讲一下:public class ObjectRef { // 基本类型的参数传递 public static void testBasicType(int m) { System.out.println("m=" + m);// m=50 m = 100; System.out.println("m=" + m);// m=100 } // 参数为对象,不改变引用的值 public static void add(StringBuffer s) { s.append("_add"); } // 参数为对象,改变引用的值 public static void changeRef(StringBuffer s) { s.append("_111"); s = new StringBuffer("Java"); s.append("_222"); } public static void main(String[] args) { int i = 50; testBasicType(i); System.out.println(i);// i=50 StringBuffer sMain = new StringBuffer("init"); System.out.println("sMain=" + sMain.toString());// sMain=init add(sMain); System.out.println("sMain=" + sMain.toString());// sMain=init_add changeRef(sMain); System.out.println("sMain=" + sMain.toString());// sMain=init_add_111 }} 你能确定按引用传递传的是hashcode?有什么依据? 这问题怎么说呢,看个人理解的。 依照我的理解是,java就是分两类东西,一类是变量,一类是对象。在代码里面走的都是变量而不是对象。传参数,永远都是复制一个变量,作为参数传进去,而不是不会复制一个对象传进去。所以严格的意义上来说都是传值,而不是传址。只是由于代表对象的变量是一个记录地址的指针。所以才有传址一说。 java也有人说有传递引用的概念.但和传统的引用传递不一样。 Java中一切都是值传递。你可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候,like this: Apple a = new Apple(); a 存的就是这个对象实例的地址。而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。 所以说java中的都是按值传递 传递的是变量的值。先理解引用变量是个什么东西。Core Java这本书上画图说明了,建议去看看。一看内存图就明白了 基本类型(int, double.....), 可变对象(stringbuffer, Date .....)传值.不变对象(String....) 传址. 首先需理解引用的值跟引用值里存放的内容是两个不同东西,引用作为参数里,引用的值是不会改变的,而引用值存放的内容是可以修改的。看下面解释:int i = 50; testBasicType(i); //i把值传给参数m后,i就什么都不管,走人了,你这样理解,i只是给m赋值,相当于只执行一句m=i,函数里面是 对m操作,当然不会对i有作用了 System.out.println(i);// i=50, StringBuffer sMain = new StringBuffer("init"); System.out.println("sMain=" + sMain.toString());// sMain=init add(sMain); //这句相当于执行了这句,参数s=sMain,也就是s跟sMain指向同一地址,函数里面操作是的s,所以并不能改变sMain的指向地址,但s改变了它指向地址的内容的话(注意是地址里存放的内容,而不是地址的值),sMain指向地址的内容也会改变. System.out.println("sMain=" + sMain.toString()); 问个关于设置组件大小的问题 关于java串口通信的问题 JavaFX类定义问题 byte数据简单相加与float数据简单相加中的类型转换搞不明白! 请问可以 在一个包含图片的JLabel上显示另一个JLabel吗? java中如何执行DOS命令 如何让一个JFrame弹出后,出现在窗口的最前面呢? 初学者,JAVA多线程优先级的疑惑,求解,多谢! Java中有没有直接比较两个整数大小的方法? 求大神帮忙哈。实现网上多线程下载但是出现问题? java 如何 实现 动态 读取配置文件,请多指教,谢谢!! 关于多种分类表的设计问题(如商品分类和栏目分类等其他分类应该用同一个表?)
对于这种问题,还是套用Bruce Eckel的话:这依赖于你如何看待引用,最终你会明白,这个争论并没那么重要。真正重要的是,你要理解,传引用使得(调用者的)对象的修改变得不可预期。请问:"传引用使得(调用者的)对象的修改变得不可预期. "这句话是什么意思???
// 基本类型的参数传递
public static void testBasicType(int m) {
System.out.println("m=" + m);// m=50
m = 100;
System.out.println("m=" + m);// m=100
} // 参数为对象,不改变引用的值
public static void add(StringBuffer s) {
s.append("_add");
} // 参数为对象,改变引用的值
public static void changeRef(StringBuffer s) {
s.append("_111");
s = new StringBuffer("Java");
s.append("_222");
} public static void main(String[] args) {
int i = 50;
testBasicType(i);
System.out.println(i);// i=50
StringBuffer sMain = new StringBuffer("init");
System.out.println("sMain=" + sMain.toString());// sMain=init
add(sMain);
System.out.println("sMain=" + sMain.toString());// sMain=init_add
changeRef(sMain);
System.out.println("sMain=" + sMain.toString());// sMain=init_add_111
}}
你能确定按引用传递传的是hashcode?
有什么依据?
依照我的理解是,java就是分两类东西,一类是变量,一类是对象。在代码里面走的都是变量而不是对象。传参数,永远都是复制一个变量,作为参数传进去,而不是不会复制一个对象传进去。所以严格的意义上来说都是传值,而不是传址。只是由于代表对象的变量是一个记录地址的指针。所以才有传址一说。
Java中一切都是值传递。你可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候,like this: Apple a = new Apple(); a 存的就是这个对象实例的地址。而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。
所以说java中的都是按值传递
先理解引用变量是个什么东西。
Core Java这本书上画图说明了,建议去看看。一看内存图就明白了
不变对象(String....) 传址.
首先需理解
引用的值跟引用值里存放的内容是两个不同东西,引用作为参数里,引用的值是不会改变的,而引用值存放的内容是可以修改的。看下面解释:
int i = 50;
testBasicType(i); //i把值传给参数m后,i就什么都不管,走人了,你这样理解,i只是给m赋值,相当于只执行一句m=i,函数里面是 对m操作,当然不会对i有作用了
System.out.println(i);// i=50,
StringBuffer sMain = new StringBuffer("init");
System.out.println("sMain=" + sMain.toString());// sMain=init
add(sMain); //这句相当于执行了这句,参数s=sMain,也就是s跟sMain指向同一地址,函数里面操作是的s,所以并不能改变sMain的指向地址,但s改变了它指向地址的内容的话(注意是地址里存放的内容,而不是地址的值),sMain指向地址的内容也会改变.
System.out.println("sMain=" + sMain.toString());