为什么值不变啊

woaiwangchan 2008-11-29 07:57:39
public class adas {
public void aa(Integer j)
{
j++;
}
public static void main(String[] args) {

int i=0;
Integer j=new Integer(i);
adas p=new adas();
p.aa(j);
System.out.println("j:"+j);
System.out.println("i:"+i);
}

}
创建了 Integer对象 传进去的应该是地址啊 怎么值不变
...全文
276 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
xierongyu 2008-12-04
  • 打赏
  • 举报
回复
上面的aa()方法忘了删除,不好意思
xierongyu 2008-12-04
  • 打赏
  • 举报
回复
一般类如下B类是可以改变值的
class B{
int i = 1;
}
class A {
public void aa(String s)
{
s+=1;
}
public static void main(String[] args) {

B b = new B();
B c = b;
c.i = 4;
System.out.println("i:"+b.i);
}

}

但String 和包装类是特殊情况,具有不变性
如:
class A{
public static void main(String[] args){
String b = "ABCD";
String c = b;
c = c +"E";
System.out.println(b);//此处得到的b还是“ABCD”
}
}
xierongyu 2008-12-04
  • 打赏
  • 举报
回复
Integer等包装类与String类一样具有不变性的特性
renmms 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ZangXT 的回复:]
引用 13 楼 berlou 的回复:
有意思的是很多java程序员理解的就是pass by reference, 以前我呆过2个大企业的PM都反复跟我强调这点, 面试时我说by value, 他们说by ref, 结果我面试成功后进入项目实际演示给他们看, 就服了。 最有意思的是其中一个SCJP居然靠了96分。真不知道SCJP还有什么用。

我记得国内好多书里面都说pass by reference,然后老师上课也那么讲,写过代码才知道纯粹胡扯.
[/Quote]

呵呵,说的对。
ZangXT 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 berlou 的回复:]
有意思的是很多java程序员理解的就是pass by reference, 以前我呆过2个大企业的PM都反复跟我强调这点, 面试时我说by value, 他们说by ref, 结果我面试成功后进入项目实际演示给他们看, 就服了。 最有意思的是其中一个SCJP居然靠了96分。真不知道SCJP还有什么用。
[/Quote]
我记得国内好多书里面都说pass by reference,然后老师上课也那么讲,写过代码才知道纯粹胡扯.
our651 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 berlou 的回复:]
有意思的是很多java程序员理解的就是pass by reference, 以前我呆过2个大企业的PM都反复跟我强调这点, 面试时我说by value, 他们说by ref, 结果我面试成功后进入项目实际演示给他们看, 就服了。 最有意思的是其中一个SCJP居然靠了96分。真不知道SCJP还有什么用。
[/Quote]

什么值传递,引用传递的。
这个争论的烂了,结果现在也没有出来。

主要是,看站在什么角度来看
引用传递:我只给了你一个对象的引用,没有给你对象的值(对比c++可以把对象传入)
值传递 :好歹你传我的引用也要有个变量来装,这个变量代表了一个值,这个值用来代表对象地址,
这样说,传的是值也并无大错

所以这个什么传递的是个不应该争论的问题
berlou 2008-12-02
  • 打赏
  • 举报
回复
有意思的是很多java程序员理解的就是pass by reference, 以前我呆过2个大企业的PM都反复跟我强调这点, 面试时我说by value, 他们说by ref, 结果我面试成功后进入项目实际演示给他们看, 就服了。 最有意思的是其中一个SCJP居然靠了96分。真不知道SCJP还有什么用。
berlou 2008-12-02
  • 打赏
  • 举报
回复
楼上有几个说传引用引用的说法不正确。
ZangTX说的是对的, java都是pass by value的。
你即使传个数组进来, 比如int[] arr
如果你对arr[i]赋值是生效的, 你对arr本身赋值是不生效的。 对象也是如此。
跟基本类型不基本类型更是不贴边。
kaixinmaliu9420 2008-12-02
  • 打赏
  • 举报
回复
public class adas {
public void aa(Integer j) {
++j; //这个地方更改了。
}
public static void main(String[] args) {

int i=0;
Integer j=new Integer(i);
adas p=new adas();
p.aa(j); //aa()方法的参数类型很重要,如果是数组或者是一个对象就是传引用调用了。
System.out.println("j:"+j); //这里还是main方法中的j
System.out.println("i:"+i);
}

}
chenliang0904 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 duhongltz 的回复:]
java 只有值传递。比如:
class ClassA {
public void method1(ClassB b) {
b = new ClassB("B");
}
}

class ClassB {
private String name;

public ClassB(String name) {
this.name = name;
}

public String toString() {
return name;
}
}

public class Test {
public static void main(String[] args) {
ClassB b = new ClassB("A");
ClassA a = new ClassA();
a.method1(b); …
[/Quote]

我稍稍加了改动,但对结果始终比较迷惑:
class ClassA {
public void method1(ClassB b) {
// b = new ClassB("B");
b.name = "B";
}
}

class ClassB {
public String name;

public ClassB(String name) {
this.name = name;
}

public String toString() {
return name;
}
}

public class Test {
public static void main(String[] args) {
ClassB b = new ClassB("A");
ClassA a = new ClassA();
a.method1(b);
System.out.print(b);
}
}
duhongltz 2008-12-02
  • 打赏
  • 举报
回复
java 只有值传递。比如:
class ClassA {
public void method1(ClassB b) {
b = new ClassB("B");
}
}

class ClassB {
private String name;

public ClassB(String name) {
this.name = name;
}

public String toString() {
return name;
}
}

public class Test {
public static void main(String[] args) {
ClassB b = new ClassB("A");
ClassA a = new ClassA();
a.method1(b);
System.out.print(b);
}
}

打印 结果是 A; 并不是什么 传递引用 就是址传递。
当然 如果你传递一个数组等 指向堆中的引用 而改变堆中内容,不过是看起来像址传递
ZangXT 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 chenliang0904 的回复:]
引用 23 楼 chenliang0904 的回复:
Java在处理参数时有两种方式:值传递和引用传递。
1.值传递:如果参数类型是String,Integer,int,Long,long等简单类型时,即使方法内部改变了参数的值,也不会影响方法外的参数本身。
2.引用传递:如果参数类型是Java复合类型,在方法内部修改了参数的值,方法外也会相应地改变。
原先我对Java类型的理解分为了基本类型和对象类型,所以对上述问题也产生过迷惑。

请参考:
http://www.l…
[/Quote]
别按那个理解了,纯粹胡扯的东西.
自己去看Core Java 
chenliang0904 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 chenliang0904 的回复:]
Java在处理参数时有两种方式:值传递和引用传递。
1.值传递:如果参数类型是String,Integer,int,Long,long等简单类型时,即使方法内部改变了参数的值,也不会影响方法外的参数本身。
2.引用传递:如果参数类型是Java复合类型,在方法内部修改了参数的值,方法外也会相应地改变。
原先我对Java类型的理解分为了基本类型和对象类型,所以对上述问题也产生过迷惑。

请参考:
http://www.lifevv.com/java/doc/2008013120…
[/Quote]

补充:
对于上述的简单类型,我的理解是基本类型int,short,long,float,boolean,char,double,byte以及它们对应的封装类型Integer,Short,Long,Float,Boolean,Character,Double,Byte的集合。
chenliang0904 2008-12-02
  • 打赏
  • 举报
回复
Java在处理参数时有两种方式:值传递和引用传递。
1.值传递:如果参数类型是String,Integer,int,Long,long等简单类型时,即使方法内部改变了参数的值,也不会影响方法外的参数本身。
2.引用传递:如果参数类型是Java复合类型,在方法内部修改了参数的值,方法外也会相应地改变。
原先我对Java类型的理解分为了基本类型和对象类型,所以对上述问题也产生过迷惑。

请参考:
http://www.lifevv.com/java/doc/20080131205712266.html
weishangzheng 2008-12-02
  • 打赏
  • 举报
回复
你这个相当于是Integer对象的首地址赋值给方法中的局部变量j,然后j+1,而你实际上Integer所包装的j的值根本就没变化
our651 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zuoguodang 的回复:]
java传值不传址
[/Quote]
还是这句精辟,前提是还要记得C的传值与传址
our651 2008-12-02
  • 打赏
  • 举报
回复
专门去搜了些资料

值传递 :如果形参是实参的拷贝,改变形参的值不会影响实参
引用传递:如果形参是实参的引用,改变形参的值将会影响实参

以上让我想起了学习C的时候,这个2个概念应该是C语言中就有的,从这个角度出发Java确是都是值传递~

不过我相信大多说“引用传递”的时候我们要表达的对象与引用的关系,这样也无可厚非啊
当然用“传递引用”这个术语会许更好
luopowusheng 2008-12-02
  • 打赏
  • 举报
回复
又是值传递 引用传递问题~~~
还是自己多拿代码测试,多总结吧,
感觉在网上看别人说的看多了,越看越糊涂!
our651 2008-12-02
  • 打赏
  • 举报
回复
不理解~谁解说下!
zuoguodang 2008-12-02
  • 打赏
  • 举报
回复
java传值不传址
加载更多回复(10)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧