转自:
http://www.java265.com/JavaCourse/202206/3770.html
下文笔者讲述java方法参数传递,到底传递了何种东西的详细简介说明,如下所示
在java的学习中,我们经常被问及一个问题, 调用java的参数时, java是进行的值传递,还是进行的引用传递呢? ---------------------------------------------- 笔者先告诉大家,java方法中的参数进行的值传递 (基础类型传入的是实际值,引用类型传入的指向引用类型的内存地址) 那么可能有人会问:有些传递的对象, 在方法里面改变了值,外面也会发生变化, 这是为什么呢?下文笔者将一一道来,如下所示 ----------------------------------------------
首先笔者会讲述java参数存储
在JVM的内存模型中 有栈和堆 栈是线程私有 每个线程都有个私有的栈 而堆是所有线程共享的 方法在执行时,都会创建一个栈帧 栈帧中的局部变量表是用来存储一组变量值的内存空间 用于存放方法参数和方法内部定义的局部变量 所以当我们做如下的代码声明时,是在栈上开辟内存空间存储 int b = 8888; User user= null; 如果我们创建对象时,user=new User()时,则会在堆上开辟内存空间,初始化User对象 然后再将User对象的地址赋值给user 从以上的存储方式,我们可以看出: 基本类型和引用类型都存在栈中 引用指向的实际对象存在堆中
例
public static void main(String[] args) {
int a = 88;
m1(a);
System.out.println(\"main1 a=\"+a);
User user = new User(\"java265\");
m2(user);
System.out.println(\"main2 name=\"+user.getName());
m3(user);
System.out.println(\"main3 name=\"+user.getName());
}
public static void m1(int a1){
a1 = 8;
System.out.println(\"m1 a1=\"+ a1);
}
public static void m2(user user1){
user1.setName(\"jjjjj\");
System.out.println(\"m1 name=\"+ user1.getName());
}
public static void m3(user user1){
user1 = new user(\"555\");
System.out.println(\"m2 name=\"+ user1.getName());
}
运行结果:
m1 a1=8
main1 a=88
m1 name=jjjjj
main2 name=jjjjj
m2 name=555
main3 name=jjjjj
从m1方法执行的结果可以验证出
当参数传递的是基本类型,将实参的值复制到方法的形参中
即传递的是原始值的副本,操作副本不会影响原始值。
从m2方法执行的结果可以验证出
当参数传递的是引用类型,是将实参的引用拷贝到方法的行参中
即:传递的是实参所引用的对象在堆中的地址值的副本
引用用于访问实际对象,也就意味着对形参进行修改会影响实参。
来源:https://www.cnblogs.com/java265/p/16445786.html
本站部分图文来源于网络,如有侵权请联系删除。
百木园