有一个问题困扰我很久,java中的参数究竟是怎么传递,很多人说java中只有值传递,但我遇到一个问题值传递是无法解释:问题的代码如下,接下来在分析。
- public class StrBTest {
- private final StringBuffer info;
- public StrBTest(String name ,String address){
- this.info = new StringBuffer("name:"+name+",address:"+address);
- }
- public StringBuffer getInfo(){
- return info;
- }
- public String toString(){
- return info.toString();
- }
- }
- public class StrBMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- StrBTest userInfo = new StrBTest("Alex","Alaska");
- StringBuffer strB = userInfo.getInfo();
- System.out.println(userInfo);
- strB.replace(5, 9, "Bob");
- System.out.println(userInfo);
- }
- }
输出结果是:
name:Alex,address:Alaska
name:Bob,address:Alaska
很显然的,在这个过程中,在StrBMain中获取了StingBuffer对象userInfo.info的引用并赋值给了strB,并且改变了它的值,
如果是值传递,那么userInfo中info属性的值就不会发生变化,但是很显然和我们的想法不一样,userInfo中info的值发生了变化,也就说userInfo遭到了破坏,这也就不符合 immutable pattern了。所以我的结论是:
1.java的传递基本类型(如int,long等)的时候是值传递的。
2.java传递一般类(Object的子类)时候是引用传递。
进一步分析:
- public class Person {
- private String name;
- private int num;
- public Person(String name, int num) {
- this.name = name;
- this.num = num;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setNum(int num) {
- this.num = num;
- }
- public int getNum() {
- return num;
- }
- public String toString(){
- return "name :"+name+" , number :"+num;
- }
- }
- public class StrBMain {
- public static void main(String[] args) {
- Person person = new Person("Dalton",8394);
- System.out.println(person);
- change(person);
- System.out.println(person);
- }
- private static void change(Person person){
- person.setName("Bobby");
- }
- }
结果是:name :Dalton , number :8394
name :Bobby , number :8394
程序工作过程:main方法中先实例化了一个Person类,并在控制台输出。
接下来,person传递给change()方法,在change()方法中改变了Person的name属性,这个改变也反映到了person实例中,把person的name属性改变成“Bobby”。这个过程明显是引用传递。
而且很明显的,在递归处理时很需要,参数的引用传递的。
以上仅代表个人观点,有错望指出。