java函数到底是不是按值传参啊?要命了
《java核心技术》第八版,第115页,第4.5节,第二段:java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数的值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。
但下面的代码却修改了值,这是何道理?输出:100
import java.io.Console;import java.util.*;import java.lang.System;import java.math.BigInteger;import java.io.*;class Employee{ public Employee(int money) { this.salary = money; } public int salary;}public class EmployeeTest{ public static void main(String[] args) { Employee ea = new Employee(10); A.s(ea); System.out.println(ea.salary ); }}class A{ static void s (Employee m) { m.salary = m.salary *10; }}
class A{ static void s (Employee m) { m = new Employee(100); }}
[解决办法]
对呀,就是100 ,传的是值,不过这个值有些特别 是一个指向那个对象的引用,而不是对象
方法中的形参e(局部变量,只在方法内有效),接收引用,此时,引用指向的值,依然是那个对象
然后通过引用 改变对象中的值,(此时有两个引用指向那个对象)
局部变量(形参)e生命周期结束了
并没有改变主函数中的引用sa(sa的指向还是不变)
主函数中的sa还是指向那个对象
此时的对象内容,已经被另一个引用改变了,所以打印出来的内容是改变后的内容
[解决办法]
static void s (Employee m)
{
m.salary = m.salary *10;
}
=>
static void s (Employee m)
{
m = new Employee(20); // 这叫修改变量m的内容。上面是修改引用m所指向对象的内容。
}
[解决办法]
基本类型值传递,其他则引用传递
[解决办法]
学习了。
[解决办法]
把Employee换成基本数据类型值就不变了
[解决办法]
整明白这个问题,java就算入门了
[解决办法]
将对象作为参数传递,那么方法里修改的和方法外修改的就是同一个对象
[解决办法]
值传递
[解决办法]
你坚持一个信念 不用 . 号 是永远不能改变对象数据的。
[解决办法]
基本类型 传递值 而引用类型 传递的是地址
[解决办法]
java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数的值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。’
其实这句话已经说的很明确了:你程序修改的值,而不是那个值的一个拷贝,即参数
[解决办法]
}
}
运行上面的程序得到如下结果:
10
5
引用三楼:
实际上,调用A.s后,形参m和实参ea都指向一个对象,通过m调用对象的方法改变了对象的状态,由ea和m引用同一个对象,所以ea也改变了。
[解决办法]
按值传递,指的是在方法调用时,传递的参数是按值的拷贝传递;
按引用传递,指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
[解决办法]
java语言中只有值传递,当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用,对象的内容可以在被调用的方法中改变,但是对象的引用确实永远不会改变的。