2.[Think in Java笔记]赋值与传递

简介:

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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  0
20


Java形参与实参

形参是定义方法的时候,该方法所携带的参数。上述publicvoid another(ValHod v, int i)方法,v和i就是形参。形参在整个another方法内都可以使用,离开该方法不能使用。

实参出现在主调函数中,实现方法调用的时候,主调函数把实参的值付给形参。上述publicvoid amethod() { …another(v, i ); … }方法,v和i就是实参。当进入被调函数anther后,实参变量不能使用。

即:发生函数调用时,主调函数把实参的值传递给被调函数的形参从而实现主调函数向被调函数的数据传送。

1.形参变量只有在被调用时才分配内存空间,在调用结束时,即释放所分配的内存空间。因此,形参只有在函数内部有效,函数调用结束返回主调函数后,不能再使用形参参数。

2.在进行函数调用时,实参必须具有确定的值。

3.实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。

4.函数调用数据传输是单向的,即实参值只能传递给形参,不能反之。因此在函数调用时,形参的值发生改变,实参的值不会变化。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。


案例讲解










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1224954,如需转载请自行联系原作者
目录
相关文章
|
24天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
24天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
33 2
|
23天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
42 0
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
13 0
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
34 1
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
30 1