|
|
本帖最后由 pansong291 于 2019-3-29 12:43 编辑
上篇:38.this引用句柄---面向对象
下篇:40.static关键字---面向对象
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
基本数据类型的参数传递
我们在前面已经讲了方法的参数传递过程,并强调了方法的形式参数就相当于方法中定义的局
部变量,方法调用结束时也就被释放了,不会影响到主程序中同名的局部变量,我们看看下面
的程序代码:
class PassValue
{
public static void main(String [] args)
{
int x = 5;
change(x);
System.out.println(x);
}
public static void change(int x)
{
x = 3;
}
}
请问:上面的程序打出的结果是 3 还是 5 呢?我们通过下面的图 3.16 来描述 change
方法被调用的内存状况。
显然,change 方法从开始到结束的过程中并没有改变 main 方法中的 x 的值,所以打印
出来的结果应该是 5。可见,基本类型的变量作为实参传递,并不能改变这个变量的值。
引用数据类型的参数传递
对象的引用变量并不是对象本身,它们只是对象的句柄(名称)。就好像一个人可以有
多个名称一样(如中文名,英文名),一个对象可以有多个句柄,我们在前面已经讲过对象
的生命期与引用变量之间的关系。
class PassRef
{
int x ;
public static void main(String [] args)
{
PassRef obj = new PassRef();
obj.x = 5;
change(obj);
System.out.println(obj.x);
}
public static void change(PassRef obj)
{
obj.x=3;
}
}
上面的程序打印出来的结果是多少呢?编译运行一下,打印的结果是 3,这是为什么
呢?
我们通过图 3.17 来看一下发生了什么:
main方法中的obj值没有改变,这和3.16中的过程是一样的,所以还是指向那个对象,
但指向的对象的内容已在change方法中被改变。 change方法中的obj(这里用A标记)就好
比main方法中的obj(这里用B标记)的别名,对A所引用的对象的任何操作就是对B所引用的
对象的操作。例如有人名叫张小二,他的绰号是“五狗子”,说“五狗子”怎么怎么的,其
实就是对张小二说三道四。
Java 语言在给被调用方法的参数赋值时,只采用传值的方式。所以,基本类型数据传
递的是该数据的值本身,引用类型数据传递的也是这个变量的值本身,即对象的引用(句柄),
而非对象本身,通过方法调用,可以改变对象的内容,但是对象的引用是不能改变的。 对
于数组,也属于引用类型,将数组对象作为参数传递,和上面的例子有同样的效果,如:
class PassRef
{
public static void main(String [] args)
{
int [] x= new int[1];
x[0] = 5;
change(x);
System.out.println(x[0]);
}
public static void change(int [] x)
{
x[0] = 3;
}
}
我们接着将上面传递对象引用的程序略作修改,大家来分析一下这个修改后的程序打印
出来的结果是多少。
class PassRef
{
int x ;
public static void main(String [] args)
{
PassRef obj = new PassRef();
obj.x = 5;
change(obj);
System.out.println(obj.x);
}
public static void change(PassRef obj)
{
obj = new PassRef();
obj.x=3;
}
}
这段程序中内存的分配情况如图 3.18 所示:
可见,我们在程序中编写的方法,如果不小心写出了类似上面的 change 方法中的代码,
根本没有任何意义,因为这个方法的调用对程序的功能没有起到任何作用,在 Java 中,我
们一般不会出现这样的错误,但在 C 语言的指向指针的指针参数传递过程中,少不了会出现
这样的错误。
上篇:38.this引用句柄---面向对象
下篇:40.static关键字---面向对象 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +1
金币 +10
|