1.基本数据类型
-
Java中总是采用按值掉哦那个,方法得到的是所有参数的一个副本,方法并不修改给它的任何参数变量的内容。
-
程序如下
public class Test2 { private static int i = 10; public static void transfer(int i){ i = i * 3; } public static void main(String[] args){ transfer(i); System.out.println(i);//输出为10 } }
很明显使用transfer方法并没有改变i的值,i当作参数被传入时,只是传入一个副本,只在这个方法内有效。当这个方法执行结束之后,i依然是10,这足以说明基本数据类型在Java中是按值传递的,若是按引用传递那应该i的值被改变。
2.对象引用
-
一个Employee类
public class Employee { private String name; private Integer salary; public Employee(String name, Integer salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getSalary() { return salary; } public void setSalary(Integer salary) { this.salary = salary; } /** * 将员工工资增长三倍的方法 * @param employee 传入一个employee对象 */ public void transfer(Employee employee){ employee.salary = employee.salary*3; } }
-
一个测试类
public class EmployeeTest { public static void main(String args[]){ //创建一个Employee对象的对象引用e,此时e并没有指向哪个对象。 Employee e; //e指向new Employee("dd",232)这个对象实例 e = new Employee("dd",232); //调用增长工资方法 e.transfer(e); System.out.println(e.getSalary());//输出696 } }
-
可以看到,当调用了transfer升高工资的方法的时候,这时候调用getSalary()方法输出的是三倍工资,这时候会怀疑Java中的对象是否是按引用调用而不是按值调用。其实不是,上面第四行代码,创建了一个对象引用,此时这个对象引用还没有指向某个对象实例。第六行new 一个对象之后,e这个对象引用指向了这个对象实例。一个对象引用可以指向0个或1个对象实例。当第八行把e这个对象引用当作参数传递进去的时候,这时候会生成一个e的对象引用的副本,这个副本和e指向的是同一个对象实例。一个对象实例可以有n个对象引用指向它。在transfer方法中操作这个副本,其改变了这个对象实例。当这个方法结束之后,副本被弃用,但是e这个 对象引用指向的还是这个对象实例,而在transfer中改变了这个对象实例的状态,所以调用getSalary()后输出的是三倍工资。但这并不是说Java中对象是按引用传递的,具体看下面这个程序。
-
一个交换 两个对象的方法
public class EmployeeTest { public static void swap(Employee a,Employee b){ Employee temp; temp = a; a = b; b = temp; System.out.println(a.getName());//输出bb System.out.println(b.getName());//输出aa } public static void main(String args[]){ Employee e1 = new Employee("aa",11); Employee e2 = new Employee("bb",22); swap(e1,e2); System.out.println(e1.getName());//输出aa System.out.println(e2.getName());//输出bb } }
-
上面的程序,当把e1和e2当作参数传递进去的时候,此时会生成这两个对象的副本,进行对象交换的方法swap只是交换了两个 对象的副本的对象实例。当方法结束之后,副本被弃用,e1和e2所指向的对象实例并没有发生改变。如果是按引用调用,那么e1和e2所指向的对象实例也应该被交换事实并没有。Java中对对象采用的不是按引用调用,实际上,对象引用是按值传递的。