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

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类型的原生数据类型数据,只是赋值过去,赋完值之后,你自己运算,我还是我不变。


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









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值