Java关键字---this的由来和其三大作用

【声明】欢迎转载,但请保留文章原始出处→_→

秦学苦练:http://www.cnblogs.com/Qinstudy/

文章来源:http://www.cnblogs.com/Qinstudy/p/Qinstudy.html

【正文】 

秦学苦练博主,你好!我是立志要掌握Java编程语言的一名小白,最近我在学习Java中的面向对象的三大特性(封装、继承、多态)时,常常会碰到this关键词,但书上只是简单讲了this的几个作用,我听得是云里雾里,并没有讲解Java设计者为什么要创建this关键字,是出于一个什么原因创建了this关键字呢?还有this关键字解决了什么问题呢?

这些都是我的疑惑,至于我为什么问到这些问题,是因为我觉得学习概念不仅仅要学习概念的本身,更重要的是了解、理解知识的由来。再次拜谢博主啦----秦学苦练

Java初学者——小张

秦学苦练的回答:

小张,你好!我刚开始学习this时,也只知道this关键字在程序中有哪些作用,但不知道this关键字怎么产生的?你讲的这句话很好--学习概念不仅仅要学习概念的本身,更重要的是了解、理解知识的由来

你提出了两个问题,我把问题罗列出来:

1.Java设计者为什么要创建this关键字,是出于一个什么原因创建了this关键字呢?           简言之,this关键字产生的背景

2.还有this关键字解决了什么问题呢?       简言之,this关键字的作用

受“更重要的是了解、理解知识的由来”的鼓舞,我去网上查阅了相关资料,《Java编程思想》(第四版第5章5.4,P84页)给出了不错的回答。下面我把书中的知识按照自己的理解讲述一下:

this关键字可以这么去理解,在英语中,指示代词this,用来指代某个东西,例如:Look,this is  a table.  this指代table。

在Java语言的设计中,this也是具有指向关系的。

1. this关键字产生的背景

我先来回答,Java设计人员为什么创建了this关键字?我将用一段代码来说明原因。

 1 class Person{
 2      public void speak(){
 3           System.out.println("某一个对象去调用方法");
 4     }
 5
 6     public static void main(String[] args){
 7       Person p1=new Person();
 8       Person p2=new Person();
 9       p1.speak();     //p1对象去调用speak()方法
10       p2.speak();    //p2对象去调用speak()方法

11 }

(亲测)运行结果:

某一个对象去调用方法
某一个对象去调用方法

但是,当只有一个speak()方法,编译器如何知道speak()方法是被p1还是被p2所调用的呢?为了能用简便、面向对象的语法来编写代码--即“发送消息给对象”,编译器做了一些幕后工作。它暗自把”所操作对象的引用”作为第一个参数传递给speak()方法。所以上述调用后的方法变成了这样:

Person speak(p1);

Person speak(p2);

这是内部的表现形式。如果我们这样写,编译器会报错,但这种写法会帮助你去理解编译器所做的事。假设你希望在方法的内部获得对当前对象的引用,由于这个引用是编译器“偷偷”传入的,所以没有标识符可用。

于是,为了解决‘在方法的内部获得对当前对象的引用’这一背景问题,Java设计师专门设计了this关键字,用来在方法的内部获得对当前对象的引用。this关键字只能在方法内部使用,表示对"调用方法的那个对象“的引用。可以这么说,this的用法和其他new出来对象的引用并无不同

但要注意,如果在方法内部调用同一个类的另一个方法时,可以省略this,直接调用即可。因为当前方法中的this引用会自动应用于同一类中的其他方法。所以小张你可以这样写代码,编译器是不会报错的:

class Person{
  public void speak(){}
  public void eat(){
   //在方法内部调用同一个类的另一个方法时,可以省略this,直接调用即可。
    speak(); //编译器自动翻译成this.speak()。
  }
  public static void main(String[] args){
  }
}

这就是this关键字为什么产生了,小张啊,总而言之,this关键字产生的背景:为了解决‘在方法的内部获得对当前对象的引用’这一问题。this关键字被设计出来了,用来在方法的内部获得对当前对象的引用。

2.this关键字的作用

三大作用:

1) 区分局部变量和成员变量同名情况this.成员变量调用本类中的成员变量;

2)通过this.方法()调用本类中的方法;

    3)this在构造方法之间的调用。

小张啊,也许你看了这三大作用,可能还是云里雾里。你在信中,说自己在学习Java中的面向对象的三大特性封装、继承、多态),所以我认为你已经懂了private封装、extends继承,并且

知道set、get方法,和空参、有参构造方法的相关概念。下面这个程序需要你有上面的这些基础,如果你暂时没有这些基础,不用着急,先去看看这些基础。看懂这些基础后,你再回过头来,看下面的代码,你会有种豁然开朗的顿悟!

如果你已经有了上面这些基础,下面我用一个完整的程序将this关键字的三大作用讲清楚。

package day_12;
//Person类
public class Person {
      private String name;
      private int age;

      public Person(String name){//String name中的name是局部变量
         //  this的作用1:区分局部变量和成员变量同名情况
          this.name=name; //this.name中的name是成员变量
      }
      public Person(String name,int age){
          //作用3:this关键字在构造方法间的调用
          this(name);   //用this(name)去调用只有一个参数 name的构造方法
          this.age=age;
      }

      public void setName(String name){
          this.name=name;
      }
      public String getName(){
          return this.name;
      }

      public void setAge(){
          this.age=age;
      }
      public int getAge(){
          return this.age;
      }
}
package day_12;
//Worker类
public class Worker extends Person {
    public Worker(String name,int age){
        super(name,age);  //super(name,age) 调用父类Person的具有两个参数的构造方法。
    }

    public void work(){
        //作用2:this在方法中的使用
        System.out.println(this.getName()+"在砍树!");
    }
}

使用this.getName() 有封装的思想在里面。由于不知道调用getName()方法的对象是谁,我就用模糊的概念,哪个对象去调用work()方法,this就指代哪个对象

很显然,Worker类的对象wk去调用work()方法,那this就指向了wk对象。所以用this.getName()来获得wk对象中的属性:光头强。

//测试类:Test

package day_12;

public class Test {
   public static void main(String[] args){
       Worker wk=new Worker("光头强",28);
       wk.work();
   }
}

(亲测)运行结果:光头强在砍树

3.方法论

小张,很高兴,你能提出这样两个问题,这两个问题促使我去思考this关键字产生的背景以及this的三大作用。给你讲述了this之后,我觉得自己对this的理解又加深了!小张啊,以后在Java学习过程中遇到云里雾里的问题,尽管给我写信,只要是我能弄明白的,一定平铺直叙地讲清楚。学习一门语言,多思考、常总结是不错的状态,与你共勉!

原文地址:https://www.cnblogs.com/Qinstudy/p/Qinstudy.html

时间: 2024-10-07 05:35:03

Java关键字---this的由来和其三大作用的相关文章

Java关键字final、static使用总结

Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不

Java关键字synchronized详解

Java关键字synchronized详解 博客分类: Java综合 Java多线程thread互联网制造 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法: 通过在方法声明中

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

[转] Java关键字final、static使用总结

Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不

java关键字详解

Java关键字及其作用 目录 Java关键字及其作用--- 1 一.     关键字总览:2 二.     详细解释--- 3 1.访问控制--- 3 1)私有的-- 3      private 2)受保护的-- 3      protected 3)公共的-- 3      public 2.类.方法和变量修饰符--- 3 1)声明抽象-- 3      abstract 2)类-- 4      class 3)继承.扩展-- 4      extends 4)最终.不可改变-- 4   

我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai", articletype: "1&

转!Java关键字final、static使用总结

Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的. final方法不能被子类的方法覆盖,但可以被继承. final成员变量表示常量,只能被赋值一次,赋值后值不再改变. final不能用于修饰构造方法. 注意:父类的private成员方法

[Java] 关键字final、static使用总结

一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final类不能被继承,没有子类,final类中的方法默认是final的.final方法不能被子类的方法覆盖,但可以被继承.final成员变量表示常量,只能被赋值一次,赋值后值不再改变.final不能用于修饰构造方法.注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是

java关键字及其作用

一. 关键字总览: 访问控制 private protected public             类,方法和变量修饰符 abstract class extends final implements interface native new static strictfp synchronized transient volatile           程序控制 break continue return do while if else for instanceof switch ca