java中对象的参数传递都是引用传递? java中对象的参数传递都是引用传递嘛?没有值传递嘛?能不能给个比较系统的回答,谢谢拉。呵呵。这个搞不是很明白 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 4类8种是值传递,其他的都是 引用的逻辑型boolean字符型char整形byteshortintlong实数型 浮点型floatdouble 可以说是值传递也可以说是引用传递,要看个人对这两个概念怎么理解public class NewTest { public static void main(String args[]){ Hello hello = new Hello(4); changeHello1(hello); System.out.println("Hello.i=" + hello.getI()); hello = new Hello(4); changeHello2(hello); System.out.println("Hello.i=" + hello.getI()); } public static void changeHello1(Hello hello){ hello.setI(3); } public static void changeHello2(Hello hello){ hello = new Hello(2); }}class Hello{ private int i = 0; public Hello(int i){ this.i = i; } public void setI(int i){ this.i = i; } public int getI(){ return i; }}上面的程序结果是什么?如果你能正确回答,那么你已经知道你的问题的答案了 public class NewTest {public static void main(String args[]){Hello hello = new Hello(4);//创建一个<Hello对象>,<引用类型>changeHello1(hello); /*调用NewTest静态方法,将你新建的hello的值,确切的说是 <hello引用的值>传递给changeHello1的<形参hello>,在使用 changeHello1的形参hello,调用 class Hello 中的setI方法, 应为传递的是 <引用的值> ,所以changeHello1的<形参hello> == Hello hello = new Hello(4)这句话New出来的 Hello, 操作changeHello1的<形参hello> 等于直接操作 new出来的hello 所以输出的hello是 3*/System.out.println("Hello.i=" + hello.getI());//hello = new Hello(4);changeHello2(hello);System.out.println("Hello.i=" + hello.getI());}public static void changeHello1(Hello hello){hello.setI(3);}public static void changeHello2(Hello hello){hello = new Hello(2);//他是让changeHello2的<形参hello> 等于 new 出来的新对象(可以说 // 是引用)} //等于说 这个changeHello2的<形参hello>的引用不在指向 //hello = new Hello(4)而是指向changeHello2()方法中hello = new Hello(2) //既然不时操作一个对象,所以输出原值4 //我上次打得4类8种之外的,全是 引用的, 只要引用相等,他们就是一个对象。//值传递 可以说是 COPY 传递}class Hello{private int i = 0;public Hello(int i){this.i = i;}public void setI(int i){this.i = i;}public int getI(){return i;}} java 核心技术里面说得很清楚了方法参数共有两种:基本类型和对象引用1.方法不能修改基本类型(即数字或布尔值)的参数2.方法可以修改对象参数的状态3.方法不能让对象参数指向新的对象 可以说java中的传递都是值传递,这个值指的是参数地址的值。不过也有说基本类型和String是值传递,其他的都是引用传递,还是看个人理解了,这个很多书里面都有论述,好像这两种观点都有提及,^_^ 迷糊 vagrant1984(曾因酒醉鞭名马, 生怕情多误美人) 这位兄弟你看的那本书里说 String是值传递 的啊, 介绍给我看看,虽然我看书想睡觉但是我想看看,那本书有多么的帅 一楼回答很清楚了,8类基本类型值传递其他都引用传递String类的想不清楚再好好想想 要注意String类基本用法,还是很容易想通的 可以看成都是值传递,如果是对象类型,其实是传递的引用的副本,比如:函数:change(A c){c=new A();}A a=new A();change(a);传给change函数的是引用a的副本,所以在函数里改掉a指向的对象以后,并不影像函数外引用a的值,在函数退出后,引用a还是以前的值 LS的说错了吧,change(a);后a的值应该是被改变后的值,方法参数中传递的是对象引用的副本而不是值的副本,也就是说只是传递堆中的拷贝而不是栈中的 java中 只有两种传递方式,即值传递和引用传递。所有基本数据类型都是采用值传递的方式,而所有对象都是采用引用传递的方式,包括数组 java:是有两种参数传递,但java只有值传递,没有引用传递。。即便:发生引用传递,那java也会把引用传递变成值传递,传出去。 xiangfeidecainiao() 说话可仔细看了,那个值到底是什么值?我还特别标明了 一般传递的都是值传递但值本身可能是值参数或引用参数不过不清楚java的闭包是怎么样的 vagrant1984(曾因酒醉鞭名马, 生怕情多误美人),迷糊,既然是大家刚刚学,某些概念性的问题还是要分清楚的.不好意思引用你的话<不过也有说基本类型和String是值传递,其他的都是引用传递> 和,大家都是中国人,和的意思,应该都知道吧 所以我才说<你看的那本书里说 String是值传递 的啊, 介绍给我看看,虽然我看书想 睡觉但是我想看看,那本书有多么的帅>既然你已经说出 值传递 和 引用传递,这两个概念了,请不要模糊回答别人的问题.String 类 是字符串常量,也是引用,不过 相同的 字符串他只保存一份,他保存在 data segment 中,靠的是引用自己试 ,他们的地址全部一样public class Test { public static void main (String [] args) { String s0 = new String ("HAHA"); String s1 = new String ("HAHA"); String z0 = "HAHA"; String z1 = "HAHA"; System.out.println(s0.hashCode()); System.out.println(s1.hashCode()); System.out.println(z0.hashCode()); System.out.println(z1.hashCode()); }}我个人觉得 既然新学 值传递 和 引用传递,要分清楚 申明 是 个人觉得 对了 ,谁厉害,把 int 型的地址掉出来给我看看,不要是用基本类型的封包Integer.(基本型) 分配的内存栈中 直接装的值(对象类型) 栈中装的是一个对象的引用值,只有用 引用值,才可以找到堆中的对象 请问 ownraul(小蝴蝶的人偶太太太太可爱了~~~) String类基本用法 是什么??? 汗了,不同的人有不同的理解啊我的理解 2楼的理解跟我一样 java中凡是对象传递的都是对象的引用,而8种基本类型是java为了方便程序设计而引进的,他们是值传递,他们都有对应的类的,如int-----Integer类 Java全是值传递.参考java核心技术上卷. xiangfeidecainiao():其实java里面争论这个没意思的,我最开始说的就有两种答案,看个人理解,还有你举的那个例子判断hashCode来看地址,我是觉得不对吧。public class Test {public static void main (String [] args) { String s0 = new String ("HAHA"); String s1 = new String ("HAHA"); String z0 = "HAHA"; String z1 = "HAHA"; System.out.println(s0.hashCode()); System.out.println(s1.hashCode()); // 上面的输出是相等的但是 s0 == s1应该是false吧,它们指向的地址是不一样的 System.out.println(z0.hashCode()); System.out.println(z1.hashCode()); // 这个设置到常量池的问题,z0,z1是指向相同的地址(记为A)的,常量创建的时候传给z0,z1的都是 地址A对应的值"HAHA",由于String类是final的,你不能改变z0,z1所对应地址的值,所以如果下面 z1 = "aaa"; 那原先地址A的值"HAHA"是没有改变的,但是现在传个z1的值为"aaa",对应的是另外一个地址B}}好了,咱语文功力比较差,下面那段很绕,建议还是看core java其实,我不喜欢这种无谓的争论,还是个人的理解了,说的太多反而误导!ps:写core java是大师吧,你应该看看这本书有多帅?!下次语气缓和点吧,我不喜欢这种带嘲讽的语气,你喜欢? to yyw84(乱码人生) ( 二级(初级)):你可以试试下面的代码package com;public class Test { void change(String a){ a=new String("abc"); } /** * @param args */ public static void main(String[] args) { Test t=new Test(); String s=new String("ddd"); t.change(s); System.out.println(s); }}看看打出来的是abc还是ddd,或许我错误理解了你的意思? 楼上的例子不好!要是这样呢: public class Test { String change(String a){ a=new String("abc"); return a; } /** * @param args */ public static void main(String[] args) { Test t=new Test(); String s=new String("ddd"); //t.change(s); //System.out.println(s); System.out.println(t.change(s)); }} vagrant1984(曾因酒醉鞭名马, 生怕情多误美人) 谢谢指点,不过 core java 是不是只有 2本啊, 我在网上 下的时候只有 I 和 II 关于language包的问题 一个奇怪的数据初始化问题 求lwuit方面的问题 赛门铁克的面试题 怎么能将一个long转换为一个byte[8]的数组,然后在将这个数组变成long?? 新手--线程同步的困惑 如何用java实现硬盘文件搜索,谢谢 关于tomcat连接池的问题 如何把几个不同的值传给另外的CLASS中? udp在发送中文数据包(英文没有影响)只接收到一半,是什么原因怎么解决呀 怎样将字符串转换为可执行的java语句(在线等待) 武汉的达内培训怎么样?
boolean
字符型
char
整形
byte
short
int
long
实数型 浮点型
float
double
public class NewTest {
public static void main(String args[]){
Hello hello = new Hello(4);
changeHello1(hello);
System.out.println("Hello.i=" + hello.getI());
hello = new Hello(4);
changeHello2(hello);
System.out.println("Hello.i=" + hello.getI());
}
public static void changeHello1(Hello hello){
hello.setI(3);
}
public static void changeHello2(Hello hello){
hello = new Hello(2);
}}class Hello{
private int i = 0;
public Hello(int i){
this.i = i;
}
public void setI(int i){
this.i = i;
}
public int getI(){
return i;
}
}上面的程序结果是什么?如果你能正确回答,那么你已经知道你的问题的答案了
Hello hello = new Hello(4);//创建一个<Hello对象>,<引用类型>
changeHello1(hello); /*调用NewTest静态方法,将你新建的hello的值,确切的说是
<hello引用的值>传递给changeHello1的<形参hello>,在使用
changeHello1的形参hello,调用 class Hello 中的setI方法,
应为传递的是 <引用的值> ,所以changeHello1的<形参hello>
== Hello hello = new Hello(4)这句话New出来的 Hello,
操作changeHello1的<形参hello> 等于直接操作 new出来的hello
所以输出的hello是 3*/
System.out.println("Hello.i=" + hello.getI());
//
hello = new Hello(4);
changeHello2(hello);
System.out.println("Hello.i=" + hello.getI());
}public static void changeHello1(Hello hello){
hello.setI(3);
}public static void changeHello2(Hello hello){
hello = new Hello(2);//他是让changeHello2的<形参hello> 等于 new 出来的新对象(可以说
// 是引用)
} //等于说 这个changeHello2的<形参hello>的引用不在指向
//hello = new Hello(4)而是指向changeHello2()方法中hello = new Hello(2)
//既然不时操作一个对象,所以输出原值4
//我上次打得4类8种之外的,全是 引用的, 只要引用相等,他们就是一个对象。
//值传递 可以说是 COPY 传递
}class Hello{
private int i = 0;public Hello(int i){
this.i = i;
}public void setI(int i){
this.i = i;
}public int getI(){
return i;
}
}
方法参数共有两种:基本类型和对象引用
1.方法不能修改基本类型(即数字或布尔值)的参数
2.方法可以修改对象参数的状态
3.方法不能让对象参数指向新的对象
你看的那本书里说 String是值传递 的啊, 介绍给我看看,虽然我看书想睡觉
但是我想看看,那本书有多么的帅
其他都引用传递
String类的想不清楚再好好想想
函数:change(A c){
c=new A();
}
A a=new A();
change(a);
传给change函数的是引用a的副本,所以在函数里改掉a指向的对象以后,并不影像函数外引用a的值,在函数退出后,引用a还是以前的值
所有基本数据类型都是采用值传递的方式,而所有对象都是采用引用传递的方式,包括数组
但值本身可能是值参数或引用参数
不过不清楚java的闭包是怎么样的
不好意思引用你的话<不过也有说基本类型和String是值传递,其他的都是引用传递>
和,大家都是中国人,和的意思,应该都知道吧 所以我才说<你看的那本书里说 String是值传递 的啊, 介绍给我看看,虽然我看书想
睡觉但是我想看看,那本书有多么的帅>既然你已经说出 值传递 和 引用传递,这两个概念了,请不要模糊回答别人的问题.
String 类 是字符串常量,也是引用,不过 相同的 字符串他只保存一份,他保存在 data segment
中,靠的是引用
自己试 ,他们的地址全部一样
public class Test {
public static void main (String [] args) {
String s0 = new String ("HAHA");
String s1 = new String ("HAHA");
String z0 = "HAHA";
String z1 = "HAHA";
System.out.println(s0.hashCode());
System.out.println(s1.hashCode());
System.out.println(z0.hashCode());
System.out.println(z1.hashCode());
}
}我个人觉得 既然新学 值传递 和 引用传递,要分清楚
申明 是 个人觉得
我的理解 2楼的理解跟我一样
java中凡是对象传递的都是对象的引用,而8种基本类型是java为了方便程序设计而引进的,他们是值传递,他们都有对应的类的,如int-----Integer类
其实java里面争论这个没意思的,我最开始说的就有两种答案,看个人理解,还有你举的那个例子判断hashCode来看地址,我是觉得不对吧。
public class Test {
public static void main (String [] args) {
String s0 = new String ("HAHA");
String s1 = new String ("HAHA");
String z0 = "HAHA";
String z1 = "HAHA"; System.out.println(s0.hashCode());
System.out.println(s1.hashCode());
// 上面的输出是相等的但是 s0 == s1应该是false吧,它们指向的地址是不一样的
System.out.println(z0.hashCode());
System.out.println(z1.hashCode());
// 这个设置到常量池的问题,z0,z1是指向相同的地址(记为A)的,常量创建的时候传给z0,z1的都是
地址A对应的值"HAHA",由于String类是final的,你不能改变z0,z1所对应地址的值,所以如果下面
z1 = "aaa"; 那原先地址A的值"HAHA"是没有改变的,但是现在传个z1的值为"aaa",对应的是另外一个地址B
}
}好了,咱语文功力比较差,下面那段很绕,建议还是看core java
其实,我不喜欢这种无谓的争论,还是个人的理解了,说的太多反而误导!
ps:写core java是大师吧,你应该看看这本书有多帅?!下次语气缓和点吧,我不喜欢这种带嘲讽的语气,你喜欢?
你可以试试下面的代码
package com;public class Test { void change(String a){
a=new String("abc");
}
/**
* @param args
*/
public static void main(String[] args) {
Test t=new Test();
String s=new String("ddd");
t.change(s);
System.out.println(s);
}}看看打出来的是abc还是ddd,或许我错误理解了你的意思?
要是这样呢:
public class Test { String change(String a){
a=new String("abc");
return a;
}
/**
* @param args
*/
public static void main(String[] args) {
Test t=new Test();
String s=new String("ddd");
//t.change(s);
//System.out.println(s);
System.out.println(t.change(s));
}}
谢谢指点,不过 core java 是不是只有 2本啊, 我在网上 下的时候只有 I 和 II