JavaSE第十五讲:方法参数传递详解

来源:互联网 发布:安卓app 知乎 编辑:程序博客网 时间:2024/05/18 00:34
1.如果一个java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,换句话说,定义的多个类可以都不是public的。


2.在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by value)。Java中没有传引用(pass by reference)的概念。


public class ParamTest{public void changePoint(Point point){point.x = 3;point.y = 4;}public static void main(String[] args){ParamTest pt = new ParamTest();Point point = new Point();pt.changePoint(point);System.out.println(point.x);System.out.println(point.y);}}class Point{int x; //横坐标int y; //纵坐标}

执行结果:

D:\src>java ParamTest
3
4

【原因如下:main方法执Point point = new Point();时候在内存中生成一个对象里面存放X=0;Y=0初始值,同时对象返回一个point引用(如图15-1黑色所示),这个引用时在main方法的时候生成的,执行pt.changePoint(point);代码时候,调用changePoint方法,把point作为参数传递到这个函数中,此时在还没有执行方法体的时候,又生成了一个point的引用(如图15-1红色所示),相当于把这个main方法中的那个引用的地址赋值给change方法中的这个引用,所以同样指向main方法中生成的那个对象,此时执行方法体,将对象内容X=0;Y=0改为X=3;Y=4,修改放映到其他的引用中,执行完这个函数,change产生的引用销毁,打印出对象内容输出被修改的X和Y坐标。


                                                  

                                                                                                                             图15-1

修改程序如下:

public class ParamTest{public void changePoint(Point point){point = new Point();point.x = 3;point.y = 4;}public static void main(String[] args){ParamTest pt = new ParamTest();Point point = new Point();pt.changePoint(point);System.out.println(point.x);System.out.println(point.y);}}class Point{int x; //横坐标int y; //纵坐标}
执行结果:

D:\src>java ParamTest
0
0

【原因如下】:在程序执行point = new Point();与上一个程序执行情况相同,再执行完之后change方法中的point指向了新生成的对象,同时对其修改内容为X=3,Y=4;当方法执行完后,引用销毁。程序输出的坐标至始至终都是在main方法返回的引用所指向的对象内容中的,所以还是X=0,Y=0,没有被修改。如图15-2所示。次程序可以结合中 http://blog.csdn.net/xukunhui2/article/details/8169989的程序例子一起研究。


图15-2

注意其中两个point的是不一样的,为了更加清晰的明白,将上面程序写成这样,同时图15-3所示这样会更加直观明白。

修改程序如下:

public class ParamTest{public void changePoint(Point p){p = new Point();p.x = 3;p.y = 4;}public static void main(String[] args){ParamTest pt = new ParamTest();Point point = new Point();pt.changePoint(point);System.out.println(point.x);System.out.println(point.y);}}class Point{int x; //横坐标int y; //纵坐标}
执行结果:
D:\src>java ParamTest
0
0

图15-3


继续看下一个程序:

public class ParamTest2{public static void main(String[] args){C c = new C();int a = 1;c.changeInt(a);System.out.println(a);}}class C{void changeInt(int a){a++;}}
执行结果:

D:\src\Lesson 1>java ParamTest2
1

【原因如下】:传递的int类型的原生数据类型数据,只是赋值过去,赋完值之后,你自己运算,我还是我不变。


多说一句:执行方法的过程就是压栈,处理,弹出的过程,数据压入栈中,处理,再弹出是一个先入先出的过程。