像Java到底按值传递和按引用传递的问题估计在各大面试题中层出不穷,先说答案Java是按值传递,但有人疑惑那
public class test {
public static void main(String[] args) {
Employee employee=new Employee("小明",5000);
tripleSalary(employee);
System.out.println(employee.getName()+"工资为:"+employee.getSalary());
}
public static void tripleSalary(Employee x){
x.raiseSalary(200);
}
}
class Employee{
private String name;
private double salary;
public Employee(String name, double salary){
this.name=name;
this.salary=salary;
}
public void raiseSalary(double byPercent){
double raise= salary*byPercent /100;
salary+=raise;
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
}
这里不是按引用传递吗?而且也改变了数值,不是按值传递是不改变原有数值吗?
首先在这里说一下按值传递和按引用传递的定义。
- 按值传递
方法接收的是调用者提供的值 - 按引用传递
方法接收的是调用者提供的变量地址
注意这里按引用传递是类似C++中引用语法糖,而不是Java中的引用。
Java中的引用类似于C/C++中的变量指针。
具体关于C++引用可看这篇文章
具体关于Java参数传递可看这篇文章。
C 语言是很多编程语言的母胎,包括 Java,那么对于 C 语言来说,所有的方法参数都是“通过值”传递的,也就是说,传递给被调用方法的参数值存放在临时变量中,而不是存放在原来的变量中。
Java 继承了 C 语言这一特性,因此 Java 是按照值来传递的
总结:
C语言参数传递是按值传递,可传递的是变量值以及指针值(即变量地址),本质是复制。
C++中参数传递也是按值传递,和C一样,但因为多一个语法糖引用,使得它可以按值传递和按引用传递。
Java参数传递是按值传递。