this关键字
  this关键字只能在方法内部使用,表示对"调用方法的那个对象"的引用。
      this的三个用法:
      1.调用本类中的其他方法
        如果在方法内部调用同一个类的另一个方法,不需使用this,直接调用即可。当前方法中的this引用会自动应用于同一个类中的的其他方法

  1. public class Person{
  2. public void eat(){...}
  3. public void action(){
  4. eat(); // eat(); --> this.eat(); 一般省略this关键字
  5. }
  6. }

      在action内部,可以写成this.eat(); 但是编译器可以自动添加,所以没必要自己添加。
        一般只有在需要明确指出对当前对象的引用时才需要使用this关键字

   2.区别全局变量和局部变量,引用成员变量
         当出现了局部变量和全局变量重名的时候,需要对全局变量和局部变量进行区分,使用this进行区分
         this指的是当前调用者    this.变量名 指的是成员变量    this指的是当前调用者,当前调用该方法的对象

  1. public class Animal{
  2. public static void main(String[] args){
  3. Person p1 = new Person("zs");
  4. Person p2 = new Person("ww");
  5. System.out.println("p1.name="+p1.name);  //zs
  6. p1.eat();  //zs在吃东西
  7. p2.eat();  //ww在吃东西
  8. }
  9. }
  10. class Person{
  11. public String name;
  12. public int age;
  13. public char gender;
  14.  
  15. public Person(){
  16. }
  17. public Person(String name){
  18. this.name = name;
  19. }
  20. //当出现了局部变量和全局变量重名的时候,需要对全局变量和局部变量进行区分,使用this进行区分
  21. public void eat(){
  22. String name = "ls";
  23. System.out.println(this.name+"在吃东西");
  24. }
  25. }

    1).在Animal中调用Person的构造方法时,带参数的构造方法public Person(String name)中参数name与成员变量name同名,如果不使用this调用成员变量,则编译器会根据就近原则,认为name=name两个name都是参数列表的name而不是成员变量name,所以在行5中,输出结果为p1.name=null。所以要使用this明确指出调用当前对象的成员变量name:this.name=name,此时行5结果为:p1.name=zs

    2)在Animal中调用Person的eat()时,当eat()中输出直接调用name时,会就近原则调用eat()中的局部变量name,所以p1.eat()结果为:ls在吃东西

当在eat()中输出用this调用name,此时调用的时成员变量name,所以p1.eat()结果为:zs在吃东西,p2.eat()结果为:ww在吃东西

   3.在构造器中调用其他构造器
          this(); 调用本类中空的构造方法
         this(参数列表); 表示对符合此参数列表的某个构造方法的明确调用
          通过this调用其他构造方法,必须让该语句方法在构造方法的第一行,并且该构造方法只能有一个this调用其他构造方法的语句

  1. public class Animal{
  2. public static void main(String[] args){
  3. Person p = new Person("zs",12,'男'); //两个带参数的构造方法都调用了
  4. }
  5. }
  6. class Person{
  7. public String name;
  8. public int age;
  9. public char gender;
  10. public Person(){
  11. System.out.println("初始无参构造方法");
  12. }
  13. public Person(String name){
  14. System.out.println("初始name构造方法");
  15. this.name = name;
  16. }
  17. public Person(String name,int age){
  18. this(name);
  19. this.age = age;
  20. System.out.println("初始name和age构造方法");
  21. }
  22. /*
  23. //错误的写法:对this的调用必须是构造器中的第一个语句,同一个构造方法中不能出现两个this对其他构造器进行调用
  24. public Person(String name,int age){
  25. this();
  26. this(name);
  27. this.age = age;
  28. System.out.println("初始name和age构造方法");
  29. }
  30. */
  31. public Person(String name,int age,char gender){
  32. this(name,age);
  33. this.gender = gender;
  34. }
  35. }

    在上段代码中,Animal中创建Person对象p,调用构造方法public Person(String name,int age,char gender),此方法通过this(name,age);调用public Person(String name,int age),此构造方法又调用public Person(String name)构造方法

    结果:System.out.println("初始name和age构造方法");  System.out.println("初始name构造方法");
           好处:避免重复代码

  1. public class Flower{
  2. int petalCount = 0; //花瓣数量
  3. String s = "initial value";
  4. Flower(int petals){
  5. petalCount = petals;
  6. System.out.println("初始化petals的构造方法,petalCount="+petalCount);
  7. }
  8. Flower(String ss){
  9. System.out.println("初始化ss的构造方法,ss="+s);
  10. }
  11. Flower(String s,int petals){
  12. this(petals);
  13. //this(s); //同一个构造方法不能this两个
  14. this.s = s; //this.s指的是成员变量s
  15. System.out.println("String & int 参数列表");
  16. }
  17. Flower(){
  18. this("hi",47);
  19. //this(s); //同一个构造方法不能this两个
  20. this.s = s; //this.s指的是成员变量s
  21. System.out.println("无参数构造方法");
  22. }
  23. public void printPetalCount(){
  24. //this(11); //不能在其他方法中使用this()调用构造器,只能在构造器中使用
  25. System.out.println("petalCount="+petalCount+" s="s);
  26. }
  27. public static void main(String[] args){
  28. Flower flower = new Flower();
  29. x.printPetalCount();
  30. }
  31. /*
  32. 输出结果:
  33. 初始化petals的构造方法,petalCount=47
  34. String & int 参数列表
  35. 无参数构造方法
  36. petalCount=47 s=hi
  37. */
  38. }

  构造器Flower(String s,int petals)表明:可以用this调用一个构造器,但却不能调用两个,并且必须将构造器调用放置于第一行最起始处,否则会报错

  在构造器Flower(String s,int petals)中,参数s的名称和数据成员s的名字相同,所以会产生歧义,使用this来区分

  printPetalCount方法表明,除构造器外,编译器禁止在其他任何方法中调用构造器

java this关键字的使用的更多相关文章

  1. Java 并发 关键字volatile

    Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...

  2. 【转载】java final 关键字的几种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  3. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  4. [java]final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  5. [java]static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  6. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  7. java的关键字与保留字

    1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保 ...

  8. 深入java final关键字

    Java final关键字详解:https://blog.csdn.net/kuangay/article/details/81509164 深入java final关键字 用法注意点和JVM对其进行 ...

  9. Java Synchronized 关键字

    本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...

  10. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

随机推荐

  1. 小程序之 input框设置placeholder的style

    <input placeholder='></input>

  2. 下载 youtube 油管的视频

    以前也曾经用个工具下过,好像是浏览器插件. 但是到底是什么也记不起来了,删没删除,怎么删除的,全都没有记忆了. 唉,无论多么小的事,只有记到本子或者网络上,才能记得住啊. 所以,这回发现了 youtu ...

  3. 【转载】BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...

  4. Asp.Net MVC 从客户端<a href="http://www....")中检测到有潜在危险的 Request.Form 值

    Asp.Net MVC应用程序, Framework4.0: 则需要在webconfig文件的 <system.web> 配置节中加上 <httpRuntime requestVal ...

  5. RecyclerView嵌套ScrollView导致RecyclerView内容显示不全

    我们在使用RecyclerView嵌套至ScrollView内的时候 RecyclerView不在屏幕内的数据会不显示出来,这里是一个坑,我们需要重写RecyclerView /** * Create ...

  6. CF #552(div3)G 最小lcm

    题目链接:http://codeforces.com/contest/1154/problem/G 题意:lcm是最小公倍数,本题就是给你一个数组(可能会重复),要求你判断出那两个数的最小公倍数最小, ...

  7. js如何实现类的继承

    方法一:借助构造函数实现继承 这种方法的缺点:原型链上的东西并没有被继承. 方法二:借助原型链实现继承 这种方法的缺点:改变了一个实例对象,另一个实例对象也跟着改变,因为s1.__proto__ == ...

  8. js浮点数运算精度问题

    https://www.cnblogs.com/yadongliang/p/9067333.html

  9. weblogic安装部署ODM下jrules-res-xu-WL10.rar出现Can't find com.ibm.rules.res.xu.messages bundle异常

    Windows: weblogic用户新建域文件夹里面,bin目录下找到setDomainEnv.cmd文件 在set JAVA_OPTIONS=%JAVA_OPTIONS% 后面添加: " ...

  10. java多线程之堵塞的应用

    线程在Running的过程中可能会遇到阻塞情况,上次的内容我们已经使用过sleep()的方法. 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到 ...