案例
public class ValHod { public int i = 10;}public class ObParm { public static void main(String[] args) { ObParm o = new ObParm(); o.amethod(); } public void amethod() { int i = 99; ValHod v = new ValHod(); v.i = 30; another(v, i ); System.out.println(v.i); } public void another(ValHod v, int i) { i = 0; v.i = 20; ValHod vh = new ValHod(); v = vh; System.out.println(v.i + " " + i); }}输出结果:10 020
Java形参与实参
形参是定义方法的时候,该方法所携带的参数。上述publicvoid another(ValHod v, int i)方法,v和i就是形参。形参在整个another方法内都可以使用,离开该方法不能使用。
实参出现在主调函数中,实现方法调用的时候,主调函数把实参的值付给形参。上述publicvoid amethod() { …another(v, i ); … }方法,v和i就是实参。当进入被调函数anther后,实参变量不能使用。
即:发生函数调用时,主调函数把实参的值传递给被调函数的形参从而实现主调函数向被调函数的数据传送。
1.形参变量只有在被调用时才分配内存空间,在调用结束时,即释放所分配的内存空间。因此,形参只有在函数内部有效,函数调用结束返回主调函数后,不能再使用形参参数。
2.在进行函数调用时,实参必须具有确定的值。
3.实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。
4.函数调用数据传输是单向的,即实参值只能传递给形参,不能反之。因此在函数调用时,形参的值发生改变,实参的值不会变化。
public class User { String username; public User(String username) { super(); this.username = username; }}public class Master { public static void main(String[] args) { User user = new User("a"); changeUser(user); System.out.println(user.username); //a } public static void changeUser(User user) { User other = new User("b"); other = user; }}
Java引用变量赋值
Box b1 = new Box();
Box b2 = b1;
System.out.println(b1==b2);//true
你可能认为b1和b2引用的是不同的对象,但实际b1和b2引用同样的对象。将b1赋值给b2并没有分配任何内存或对原对象做任何部分的拷贝。它们指向同一个对象,因此对变量b2的改变也将影响b1。
尽管b1和b2都引用同一个对象,但是他们之间没有任何其他的关系。例如,接下来对b1的赋值仅仅使b1脱离初始对象,而没有影响对象或影响b2。
Box b1 = new Box();
Box b2 = new Box();
b2 = b1;
// ...
b1 = null;
这里,b1被设置为空,但是b2仍然指向原来的对象。
当你将一个对象引用赋值给另一个对象引用时,你并没有创建该对象的一个拷贝,而是仅仅对引用的一个拷贝。
Java值传递
在JAVA中,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”。
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象。对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
Java参数,不管是原始类型还是引用类型,传递的都是副本。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值。如果在函数中改变了副本的值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
案例讲解
关联: