java参数传递方式

网上有个很经典:java传值的方式。

一般答案都说是按值。对此我有一些疑惑,查了相关资料,终于基本弄清楚了。下面是一个测试:

package com.lzj.entity;
public class People {

private int age;
private String name;

public People() {}

public People(int age, String name) {
this.age = age;
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void show(){
System.out.println(getName()+":"+getAge());
}
}

 

package com.lzj.entity;
public class Main {

public static void main(String[] args) {
int i =9;
String s = "ppp";
People aaa = new People(40,"aaa");

modifyInt(i);
modifyString(s);
modifyObject(aaa);

System.out.println(i);
System.out.println(s);
aaa.show();
}

private static void modifyInt(int i){
i = 40;
}

private static void modifyString(String s){
s = "sss";
}

private static void modifyObject(People aaa){
aaa.setAge(11);
aaa.setName("ooo");
}

}

 

结果:

9
ppp
ooo:11

 由此可见,基本类型和String类型并没有发生变化它们是按值传递的;而一般对象发生了变化,可以说是按引用传递的。但为什么有人说对象也是按值传递的呢?理解的角度不同,他们所理解的值并不是指整个对象的具体内容,而是对象的引用(引用是什么东西呢?说白了,就是对象存储的地址,这个地址以值拷贝的方式传到了形参中,“值传递”指的就是这个)。其实对象是分两部分存储的,一个是对象引用,也就是对象在内存中的地址,存储在栈里(基本类型也是存储在栈里,栈里的东西都是值拷贝),另外一个是对象的内容,存储在堆里。

另外,我们发现String类型很奇怪,它具有基本类型的很多特点,原因之一就是它是final修饰的,既然不可变,那么执行str = "sss"时必然要new新的String,str里存放的是新的String的地址。

 

posted @ 2013-05-29 22:28  黑色刺客  阅读(96)  评论(0编辑  收藏  举报