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对象 传进去的应该是地址啊 怎么值不变
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对象 传进去的应该是地址啊 怎么值不变
解决方案 »
- 大数据文件分析提取
- the static method cannot hide instance method from object
- 数据结构-哈希表问题
- 看了一个烟火的程序后想问点问题
- 高分求解决方法!!!!!50分没人解决,我出100分.只给一个人!谢谢了
- (散分!!!)用java简单写个能播放视频的,支持的格式随便 一个就行了....
- 超级简单问题求助!
- 关于JAVA多线程问题
- 使用Blowfish的key不够长的问题
- 怎样从命令行向public static void main (String arg[])传参数!!!
- 一个有关数据库查询的出错信息,请高手释疑。
- 两个月不coding,会废掉吗?
因为:
public void aa(Integer j)
{
j++;
}
等价于:public void aa(Integer j)
{
j=Integer.valueOf(j.intVaule()+1);//对j重新赋值,当然没有用啦.
}
如果不理解,建议参考Core Java或者The Java Programming Language。
楼主看看这个:
http://blog.csdn.net/myjava_024/archive/2008/11/26/3376555.aspx
即使你的代码改成了
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);
System.out.println("i:"+i);
}
}你的结果也不会有任何的影响
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);
}
}
ZangTX说的是对的, java都是pass by value的。
你即使传个数组进来, 比如int[] arr
如果你对arr[i]赋值是生效的, 你对arr本身赋值是不生效的。 对象也是如此。
跟基本类型不基本类型更是不贴边。
引用传递:如果形参是实参的引用,改变形参的值将会影响实参以上让我想起了学习C的时候,这个2个概念应该是C语言中就有的,从这个角度出发Java确是都是值传递~不过我相信大多说“引用传递”的时候我们要表达的对象与引用的关系,这样也无可厚非啊
当然用“传递引用”这个术语会许更好
1.值传递:如果参数类型是String,Integer,int,Long,long等简单类型时,即使方法内部改变了参数的值,也不会影响方法外的参数本身。
2.引用传递:如果参数类型是Java复合类型,在方法内部修改了参数的值,方法外也会相应地改变。
原先我对Java类型的理解分为了基本类型和对象类型,所以对上述问题也产生过迷惑。请参考:
http://www.lifevv.com/java/doc/20080131205712266.html
补充:
对于上述的简单类型,我的理解是基本类型int,short,long,float,boolean,char,double,byte以及它们对应的封装类型Integer,Short,Long,Float,Boolean,Character,Double,Byte的集合。
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; 并不是什么 传递引用 就是址传递。
当然 如果你传递一个数组等 指向堆中的引用 而改变堆中内容,不过是看起来像址传递
我稍稍加了改动,但对结果始终比较迷惑:
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);
}
}
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”
}
}