java this方法_Java this 关键字(二十八)

this 关键字

1.this关键字代表当前对象

this.属性名 操作当前对象的属性

this.方法名 调用当前对象的方法

2.封装对象属性的时候,经常会使用this关键字

this.属性名

大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。

假设有一个教师类 Teacher 的定义如下:

c45a5a3f6885ceca20c61cbc86aafda9.png

在上述代码中 name、salary 和 age 的作用域是 private,因此在类外部无法对它们的值进行设置。为了解决这个问题,可以为 Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。代码如下:

33a1c351ec40eef5da3bad682d8ce2e1.png运行结果:

7a5cd216d8786b42bdc8f7c51430a6b3.png

在 Teacher 类的构造方法中使用了 this 关键字对属性 name、salary 和 age 赋值,this 表示当前对象。this.name = name语句表示一个赋值语句,等号左边的 this.name 是指当前对象具有的变量 name,等号右边的 name 表示参数传递过来的数值。

this.方法名

this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。

假设定义了一个 Dog 类,这个 Dog 对象的 run( ) 方法需要调用它的 jump( ) 方法,Dog 类的代码如下所示:

a974d69ec4676d12067b8e0d669af03a.png运行结果:

a4152bb97b4b44b5ba1a20c9df47d0c6.png

使用这种方式来定义这个 Dog 类,确实可以实现在 run( ) 方法中调用 jump( ) 方法。下面再提供一个程序来创建 Dog 对象,并调用该对象的 run( ) 方法:

105f722e4bd69ee3bbadbdc14711f262.png运行结果:

a4152bb97b4b44b5ba1a20c9df47d0c6.png

在上面的程序中,一共产生了两个 Dog 对象:

在 Dog 类的 run( ) 方法中,程序创建了一个 Dog 对象,并使用名为 d 的引用变量来指向该 Dog 对象。

在 DogTest 的 main() 方法中,程序再次创建了一个 Dog 对象,并使用名为 dog 的引用变量来指向该 Dog 对象。

Q:在 run() 方法中调用 jump() 方法时是否一定需要一个 Dog 对象?

A:是的,因为没有使用 static 修饰的成员变量和方法都必须使用对象来进行调用。

Q:是否一定需要重新创建一个 Dog 对象?

A:不一定,因为当程序调用 run() 方法时,一定会提供一个 Dog 对象,这样就可以直接使用这个已经存在的 Dog 对象,而无须重新创建新的 Dog 对象了。因此需要在 run() 方法中获得调用该方法的对象,通过 this 关键字就可以满足这个要求。

this 可以代表任何对象,当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁。

将前面的 Dog 类的 run() 方法改为如下形式会更加合适,run() 方法代码修改如下,其它代码不变:

af5d52b95c8399c510f237ebdd0f5ede.png运行结果:

a4152bb97b4b44b5ba1a20c9df47d0c6.png

从第一种 Dog 类定义来看,在 Dog 对象的 run() 方法内重新创建了一个新的 Dog 对象,并调用它的 jump() 方法,这意味着一个 Dog 对象的 run() 方法需要依赖于另一个 Dog 对象的 jump() 方法,这不符合逻辑。

第二种 Dog 类定义是当一个 Dog 对象调用 run( ) 方法时,run( ) 方法需要依赖它自己的 jump( ) 方法,与第一种定义类的方法相比,更符合实际情形。

在现实世界里,对象的一个方法依赖于另一个方法的情形很常见。例如:吃饭方法依赖于拿筷子方法,写程序方法依赖于敲键盘方法。

这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 run( ) 方法改为如下形式也完全正确:

5c517fe2598572b1ab4bdf71fba38974.png运行结果:

a4152bb97b4b44b5ba1a20c9df47d0c6.png

大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。

注意:

-  对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。

-  省略 this 前缀只是一种假象,虽然程序员省略了调用 jump() 方法之前的 this,但实际上这个 this 依然是存在的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值