您的位置:首页 > 移动开发 > Android开发

【Android安卓教学-零基础到高薪就业】面向对象(4)

2015-05-06 11:20 274 查看
【说明:此文章内容只是Android教学的内容摘要,不是教学课程内容。】

1.3对象的this引用
Java提供了一个this关键字,this关键字是一个对象的默认引用。this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的默认引用有两种情形:
》》 构造器中引用该构造器执行初始化的对象。
》》 在方法中引用该方法的对象。
this关键字最大的作用就让类中的一个方法,访问该类的另一个方法或属性。先看下面的需要,假设定义了一个Dog类,这个Dog对象的run方法需要调用它的jump方法,那么应该如何做?



使用这种方式来定义这个Dog类,确实可以实现在run方法中调用jump方法,那么这种做法是否够好呢?下面再提供一个程序来创建Dog对象,并调用该对象的run方法,代码如下。


在上面的程序中,一共产生了两个Dog对象,在Dog类的run方法中,程序创建了一个Dog对象,并使用名为d的引用变量来指向该Dog对象;在TestDog的main方法中,程序再次创建了一个Dog对象,并使用名为dog的引用变量来指向该Dog对象。这里产生了两个问题。第一个问题:在run方法中调用jump方式时是否一定需要一个Dog对象?第二个问题是:是否一定需要重新创建一个Dog对象呢?第一个问题的答案是肯定的,因为没有使用static修饰的属性和方法都必须使用对象来调用。第二个问题的答案是否定的,因为当程序调用run方法时,一定会提供一个Gog对象,这样就是可以直接使用这个已经存在的Dog对象。
为此,我们需要在run方法中获得调用该方法的对象,通过this关键字就可以满足这个需求。
this可以代表任何对象,当this出现在某个方法中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的对象只能是当前类;只用当这个方法被调用时,它所代表的对象才被确定下来;谁在调用这个方法,this就代表谁。
前面的Dog类改下为如下形式更加合适。


采用上面方法定义的Dog类更符合实际意义,当一个Dog对象调用run方法时,run方法还包含它自己的jump方法。
通常情况下,Java运行对象一个成员直接调用另一个成员,可以省略this前缀。也就是说将上面的run方法改为如下形式是正确的。



大部分时候,一个方法访问相同实例的其他方法、属性时加不加this前缀的效果是完全一样的,这与前面所介绍的类定义里个成员之间可以互相调用的结论完全一致。
对于static修饰的方法而言,则可以使用类来直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰方法中不能使用this引用。static修饰的方法不能使用this引用,static修饰的方法不能访问不使用static修饰的普通成员,这与前面指出的静态成员不能直接访问非静态成员的结论也是一致的。下图代码是错误的,静态方法直接访问非静态方法。



上面出现错误正式因为info方法是对象相关的方法,而不是类相关的方法,因此必须使用对象来调用该方法。在上面的main方法中直接调用info方法时,系统相当于使用this作为该方法的调用者,而static修饰的方法中不能使用this引用,所以程序出现错误。
如果确实需要在静态方法中访问另一个普通方法,则只能重新创建一个对象。例如将上面的info()调用改为如下形式:



大部分时候,普通方法访问其他方法、属性时无须使用this前缀,但如果方法里有个局部变量和属性同名,但程序又需要在该方法里访问这个被覆盖的属性,则必须使用this前缀。
除此之外,this引用也可以用于构造器中做为默认引用,由于构造器是直接使用关键字来调用,而不是使用对象来调用,所以在构造器中引用的是该构造器进行初始化的对象。



在ThisInConstructor构造器中使用this引用时,this总是引用该构造器正在初始化的对象,程序粗体字标识代码行正在执行初始化的ThisInConstructor对象的foo属性设为6,这意味这该构造器返回的所有对象的foo属性都等于6。
与普通方法类似的是,在构造器中访问其他属性和方法的大部分时候都可以省略this前缀,但如果构造器中有一个与属性同名的局部变量,又必须在构造器中访问这个被覆盖的属性,则必须使用this前缀。

 

联系QQ:3163173005

联系电话:075526402586
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息