对于学习java的同学来说,有一个比较容易让人困惑的问题,就是java中的参数的传递,可能大家都听到过各种的说法,比如有一种比较经典的说法就是基本数据类型是值传递的,引用数据类型是引用传递的。听起来好像很有道理,但是大家要牢记一点,就是java中只有值传递。
下面通过几个简单的代码例子来说明。
首先是简单的基本数据类型。
public class Main {
public static void main(String[] args) {
int a1 = 20;
change(a1);
System.out.println(a1);
}
private static void change(int a1) {
// TODO Auto-generated method stub
a1 = 200;
}
}
输出结果是20
这个好像比较好理解,就是基本数据类型作为方法的参数,传递的是基本数据类型的一个副本,方法中对于这个副本的改变不会影响到原来的变量的值。
下面是你引用数据类型
成员变量只有一个age
public class Person {
int age =10;
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
change(person);
System.out.println(person.age);
}
private static void change(Person person) {
// TODO Auto-generated method stub
person.age = 300;
// person = new Person();
}
private static void change(int a1) {
// TODO Auto-generated method stub
a1 = 200;
}
}
输出是300
public class Main {
public static void main(String[] args) {
// int a1 = 20;
// change(a1);
// System.out.println(a1);
Person person = new Person();
change(person);
System.out.println(person.age);
}
private static void change(Person person) {
// TODO Auto-generated method stub
// person.age = 300;
person = new Person();
}
private static void change(int a1) {
// TODO Auto-generated method stub
a1 = 200;
}
}
输出的是10
这是为什么呢?因为在将引用数据类型作为参数传递时候,同样传递是这个引用的副本。
当第一种方式进行修改引用指向的值的时候,将值从10改为300,这个时候,引用指向的值确实已经发生变化了。
当第二种方式,只是这个副本的引用指向的是另外一个变量的地址,原来的本尊却仍然指向原来的10,这样,输出的结果确实没有变化。
对于字符串来说,也是一个引用数据类型,同时它是一个final型的变量,这就导致他的值是不可变的,因此当把他作为参数传递的时候,总是将引用指向了另一个变量的内存地址,因此是输出的值是不会改变的。
public class Main {
public static void main(String[] args) {
String str = "abf";
change(str);
System.out.println(str);
}
private static void change(String str) {
// TODO Auto-generated method stub
str = "glc";
}
输出结果是abf