提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、结论
- 二、代码举例
- 1.当传入的是变量
- 2.当传入的是变量的引用
- 总结
前言
在日常写程序过程中,我们会把参数传到方法里面去,然后方法就会调用我们的参数,那么在java里面到底是按照值传递还是引用传递?在这里Mark下
一、结论
首先在这里先说明结论:根据java核心卷一里所写,java总是采用按值调用。一切传引用其实本质上是传值
二、代码举例
1.当传入的是变量
public class Test {
public static void b(double x) { //x提升3倍
x = x * 3;
}
public static void main(String[] args){
double percent=10;
b(percent);
System.out.println("percent="+percent);
}
}
运行结果
分析:
这里引用下书中的图
当我们传入percent变量的时候,x会自动初始化为percent变量的拷贝,值为10,当x*3时,x的值确实变为了30,但是percent的值不变,因为x和percent不是一个变量,而且当我们的调用结束了,x这个局部变量就会消失,不会影响到percent变量。所以说,一个方法不可能修改一个基本数据类型的参数
2.当传入的是变量的引用
代码如下(示例):
class Employee{
private int salary;
public Employee(int salary) {
this.salary = salary;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public void raiseSalary(int times){
salary=salary*times;
}
}
public class Test {
public static void b(Employee x) {
x.raiseSalary(3);
}
public static void main(String[] args){
Employee employee1=new Employee(1000);
b(employee1);
System.out.println("salary="+employee1.getSalary());
}
}
运行结果
分析
我们首先建立个Employee类,在mian方法里面,利用构造函数初始化这个类,当前employee1的工资为1000,当我们调用b方法时,我们把employee1当做参数传进去,在这里注意的是,当我们new一个对象的时候,new出来的是地址,即employee1变量里面存储的是一个地址,这个地址指向Employee类。所以我们传入到b方法的也是一个地址,按照按值传递的思想,x是employee1地址的拷贝,x也指向了这个初始化的Employee类(参考下面图片,图片里的harry用employee1代替),也就是说,x与employee1不是同一个变量,但是保存的是同一个地址,同时指向同一个类,当利用x调用raiseSalary方法,工资扩大三倍后,x 和 employee1 同时引用的那个 Employee 对象的工资提高了 3倍。方法结束后,参数变量 x 不再使用。当然,对象变量 employee1继续引用那个工资增至 3倍的雇员对象
所以说,所谓的“传递引用其实还是以值传递为根本”。
总结
•一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
•一个方法可以改变一个对象参数的状态。
•一个方法不能让对象参数引用一个新的对象