Java的传值机制
Posted hbc314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的传值机制相关的知识,希望对你有一定的参考价值。
不管多好的总结都比不上一段代码
我们先来看看基本类型的实例变量的传值机制
创建一个Student类
1 public class Student { 2 int age=18; 3 String name="Jack"; 4 }
尝试将基本类型实例变量age当做参数传入方法,在方法内修改参数的值,从而修改age的值
构造一个changeAge方法
1 public void changeAge(int in) { 2 in=0; 3 }
在main方法中实例化一个Student对象stu,调用changeAge方法来改变stu的age
1 Student stu=new Student(); 2 System.out.println("尝试改变前stu的age:"+stu.age); 3 stu.changeAge(stu.age); 4 System.out.println("尝试改变后stu的age:"+stu.age);
运行结果:
- 尝试改变前stu的age:18
- 尝试改变后stu的age:18
发现age的值没有改变,猜想传入方法中的参数只是age的一个副本而不是age本身。
在main方法中直接更改age
1 System.out.println("尝试改变前stu的age:"+stu.age); 2 stu.age=0; 3 System.out.println("尝试改变后stu的age:"+stu.age);
运行结果:
- 尝试改变前stu的age:18
- 尝试改变后stu的age:0
age发生了改变,证明是传入时出了问题,传的是副本。
我们再来看看引用类型的实例变量的传值机制
尝试将引用类型实例变量name当做参数传入方法,在方法内实例化一个新的对象并将该对象的地址传给参数,从而修改name的指向
构造一个changeName方法
public void changeName(String str) { String temp="null"; str=temp; }
在main方法中调用changeName方法来改变stu的name
1 System.out.println("尝试改变前stu的name:"+stu.name); 2 stu.changeName(stu.name); 3 System.out.println("尝试改变后stu的name:"+stu.name);
运行结果:
- 尝试改变前stu的name:Jack
- 尝试改变后stu的name:Jack
发现name并没有改变,指向的仍旧是原来的那个对象,猜想传入方法的参数不是name本身而是name的一个副本(也就是地址的一个副本)。
在main方法中直接更改name
1 System.out.println("尝试改变前stu的name:"+stu.name); 2 stu.name=("null"); 3 System.out.println("尝试改变后stu的name:"+stu.name);
运行结果:
- 尝试改变前stu的name:Jack
- 尝试改变后stu的name:null
name发生了改变,证明是传入时出了问题,传的是地址的一个副本。
代码一顿操作后来个总结是再好不过了
以上所有操作只说明一个结果:Java中传参是值传递,传入方法的只是一个copy。传基本类型的变量时传的是数据的一个copy,传引用类型的变量时传的是地址的一个copy。此时注意引用类型的变量承载的只是对象的地址而不是对象本身哦!
另(可视而不见):注意静态变量的与众不同,改变一个对象的静态变量就相当于改变所有哦。这时候如果使用对象来调用静态变量很容易造成混淆,毕竟它是属于类的。
以上是关于Java的传值机制的主要内容,如果未能解决你的问题,请参考以下文章