您的位置 首页 java

java编程思想5.4–this关键字的理解

this关键字的用法

在程序中主要的用途:

1.用this在自身的 构造方法 内部调用其他的构造方法

2.用this代表自身类的对象

  • 直接使用this
  • 使用this引用成员变量
  • 使用this调用成员方法

this的值是当前对象的引用,只能用它来调用属于当前对象的方法或者使用this引用成员变量和 局部变量 重名

应用一:引用成员变量

如上面这段代码中,有一个成员变量name,同时在方法中有一个 形式参数 ,名字也是name.到底是将形式参数name的值传递给成员变量name,还是反过来将成员变量name的值传递给形式参数name呢?

Java 编译器它是怎么判断的呢?

也就是说,两个变量名字如果相同的话,那么Java如何判断使用哪个变量?

此时this这个关键字就起到作用了。 this这个关键字其代表的就是对象中的成员变量或者方法。 也就是说,如果在某个变量前面加上一个 this关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。

为此在上面这个代码中,this.name代表的就是对象中的成员变量,又叫做对象的属性,而后面的name则是方法的形式参数,代码this.name=name就是将形式参数的值传递给成员变量。这就是上面这个代码的具体含义。

一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量,这主要是从便于代码的阅读考虑的。

一看到这个this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。不过话说回来,这是this关键字在Java语言中的最简单的应用。从这个应用中,我们可以看出this关键字其代表的就是对象的名字。

其实如果是局部变量的话,也是相同的道理。如在上面的代码中,name不是形式参数,而是一个局部变量。此时Java也会遇到相同的疑惑,即变量名name代表的到底是局部变量还是形式参数?name=name到底代表的是什么含义?

根据局部变量的作用域,在方法内部,如果局部变量与成员变量同名的话,那么是以局部变量为准。可是在name=name这个赋值语句中,将局部变量的值赋值给自己,显然并不是很合适。

根据代码的含义,本来的意思应该是将局部变量赋值给成员变量。为了更清晰的表达这个含义,为此最好采用如下的书写格式this.name=name。这里的this关键字含义就是对象名student,为此this.name就表示student.name。

应用二:调用类的构造方法

this关键字除了可以调用成员变量之外,还可以调用构造方法。

在上面这段代码中,定义了两个构造方法,一个带参数,另一个没有带参数。

构造方法都不会有返回值,不过由于构造方法的特殊性,为此不必在构造方法定义时带上void关键字。

在第一个没有带参数的构造方法中,使用了this(“Hello!”)这句代码,这句代码表示什么含义呢?

在构造方法中使this关键字表示调用类中的构造方法。

如果一个类中有多个构造方法,因为其名字都相同,跟类名一致,那么这个this到底是调用哪个构造方法呢?

其实,这跟采用其他方法引用构造方法一样,都是通过形式参数来调用构造方法的。

如上例中,this关键字后面加上了一个参数,那么就表示其引用的是带参数的构造方法。

如果现在有三个构造方法,分别为不带参数、带一个参数、带两个参数。那么Java编译器会根据所传递的参数数量的不同,来判断该调用哪个构造方法。从上面示例中可以看出,this关键字不仅可以用来引用成员变量,而且还可以用来引用构造方法。

不过如果要使用这种方式来调用构造方法的话,有一个语法上的限制。一般来说, 利用this关键字来调用构造方法,只有在构造方法中第一句使用this调用有参数的构造方法。 否则的话,翻译的时候,就会有错误信息。这跟引用成员变量不同。如果引用成员变量的话,this关键字是没有位置上的限制的。如果不熟悉这个限制的话,那么还是老老实实的采用传统的构造方法调用方式为好。虽然比较麻烦,但是至少不会出错。

应用三:返回对象的值

this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。如代码在上面student类中,那么代码代表的含义就是return student。可见,这个this关键字除了可以引用变量或者成员方法之外,还可以作为类的返回值,这才是this关键字最引人注意的地方。

为什么静态成员、 静态方法 中不能用this和super关键字

1.在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.

因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在

2.在问题之前先讲super的用法:

  • super的用法跟this类似,this代表对本类对象的引用,指向本类已经创建的对象;而super代表对父类对象的引用,指向父类对象;
  • 静态优先于对象存在;
  • 由上面的1.和2.知:因为静态优先于对象存在,所以方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,当然就会出错。

综上,静态方法中不可以出现super关键字。

3. 首先你要明白对象和类的区别。

this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西

所有的成员方法,都有一个默认的的参数this(即使是无参的方法),只要是成员方法,编译器就会给你加上this这个参数如:

Class A中
void method1(){}实际上是这样的--------> void method1(A this)
void method2(int x){}实际上是这样的--------> void method2(A this, intx)
 

而静态方法与对象无关,根本不能把对象的引用传到方法中,所以不能用this

4.在一个类中定义一个方法为static,则为静态方法,那就是说,无需本类的对象即可调用此方法,调用一个静态方法就是“类名.方法名”

既然”无需本类的对象即可调用静态方法”,而this和super关键字都是用于本类对象的-----调用静态方法无需本类的对象这句话很清楚表明:静态方法中不能用this和super关键字

5. 静态方法是存放在内存中的数据段里,this和super调用的是堆空间里的应用对象不能调用数据段区域里的数据, 因此静态方法中不能用this和super关键字

6. 静态方法和静态类不属于单个对象,而是类的所有对象共享使用,而this代表当前对象

7. 东西只属于类,不属于任何对象,所以不能用this和super。

文章来源:智云一二三科技

文章标题:java编程思想5.4–this关键字的理解

文章地址:https://www.zhihuclub.com/186446.shtml

关于作者: 智云科技

热门文章

网站地图