返回列表 发新帖

【Android入坑系列教程】39.函数的参数传递---面向对象

[复制链接]

62

主题

722

回帖

2756

积分

大学生

Rank: 5Rank: 5

金币
2029
好评
12
信誉
100

考神

发表于 2019-3-28 11:39:21 | 显示全部楼层 | 阅读模式  来自 四川
本帖最后由 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
已有2人评分好评 金币 理由
2868065442 + 1 最强入坑教程
Bin + 10 很给力!

查看全部评分 总评分:好评 +1  金币 +10 

回复

使用道具 举报

2

主题

133

回帖

421

积分

初中生

Rank: 3Rank: 3

金币
165
好评
0
信誉
100
发表于 2019-3-28 18:17:37 来自手机  | 显示全部楼层  来自 福建
金币+1,再见
回复

使用道具 举报

1

主题

2283

回帖

4494

积分

大学生

Rank: 5Rank: 5

金币
2610
好评
1
信誉
100
发表于 2019-3-28 19:12:50 | 显示全部楼层  来自 河北
我还是别回复了
回复

使用道具 举报

0

主题

380

回帖

822

积分

高中生

Rank: 4

金币
195
好评
1
信誉
100
发表于 2019-4-26 23:01:21 | 显示全部楼层  来自 河南
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表