zoukankan      html  css  js  c++  java
  • Java 面向对象(八)关键字:this

    一、this 是什么?

      1、在 Java 中,this关键字比较难理解,它的作用和其词义很接近。

      •  它在方法内部使用,即这个方法所属对象的引用;
      •     它在构造器内部使用,表示该构造器正在初始化的对象。

      2、this 可以调用类的属性、方法和构造器

      3、什么时候使用 this 关键字呢?

        当在方法内需要调用该方法的对象时,就用 this。

        具体的:我们可以用 this 来区分 属性 局部变量。比如: this.name = name;

    二、this 关键字

      1、this 关键字的使用:this可以用来修饰、调用:属性、方法、构造器

      2、this 修饰属性和方法:this理解为:当前对象  或 当前正在创建的对象

     

    三、this 的使用

      1、使用 this,调用属性、方法

        (1)在任意方法或构造器内,可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法,增强程序的阅读性。不过,通常我们都习惯省略this

        (2)当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。

        (3)使用 this 访问属性和方法时,如果在本类中未找到,会从父类中查找。

          局部变量和成员变量同名情况,可以在成员变量的前面加 this。

         上面的 setXXX 方法中的形参并不符合见名知意的规定,那么如果修改与成员变量名一致,那么就可以见名知意了。代码如下:

     1 public class Student {
     2     private String name;
     3     private int age;
     4     public void setName(String name) {
     5         name = name;
     6     } 
     7     public void setAge(int age) {
     8         age = age;
     9     }
    10 }        

          但是发现这样有问题,成员变量赋值失败了,即修改了 setXXX() 的形参变量名后,方法并没有给成员变量赋值。

         原因:由于形参变量名(局部变量名)与成员变量名重名,根据“就近原则”,优先使用局部变量,导致成员变量名被隐藏。方法中的变量名,无法访问到成员变量,从而赋值失败。


        Demo:

     1 public class Person {
     2     private String name;
     3     private int age;
     4     
     5     public Person(String name, int age) {
     6         this.name = name;
     7         this.age = age;
     8     }
     9     public void getInfo() {
    10         System.out.println("姓名" + name);
    11         this.speak();  //调用本类中的方法
    12     }
    13     public void speak() {
    14         System.out.println("年龄" + this.age);
    15     }
    16 }

       Demo2:当前正在操作本方法的对象称为当前对象。 

     1 public class PersonTest {
     2     
     3     public static void main(String[] args) {
     4         Person per1 = new Person("张三") ;
     5         Person per2 = new Person("李四") ;
     6         per1.getInfo() ; // 当前调用getInfo()方法的对象是per1
     7         per2.getInfo() ; // 当前调用getInfo()方法的对象是per2
     8         boolean b = per1.compare(per2);
     9     }
    10 }
    11 
    12 class Person {
    13     String name;
    14     Person(String name) {
    15         this.name = name;
    16     }
    17     public void getInfo() {
    18         System.out.println("Person类" + this.name);
    19     }
    20     public boolean compare(Person p) {
    21         return this.name == p.name;
    22     }
    23 }

      2、使用 this 调用本类的构造器

        (1)我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器;

        (2)构造器中不能通过"this(形参列表)"方式调用自己;

        (3)如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)";

        (4)规定:"this(形参列表)"必须声明在当前构造器的首行

        (5)构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器;

        Demo:

     1 public class Person {
     2     private String name;
     3     private int age;
     4     public Person() {    //无参构造器
     5         System.out.println("新对象实例化");
     6     }
     7     public Person(String name) {
     8         this();    //调用本类中的无参构造器
     9         this.name = name;
    10     }
    11     public Person(String name, int age) {
    12         this(name); //调用有一个参数的构造器
    13         this.age = age;
    14     }
    15     public void getInfo() {
    16         System.out.println("Person类" + this.name);
    17     }
    18     public boolean compare(Person p) {
    19         return this.name == p.name;
    20     }
    21 }

    四、this 的注意点

      1、可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!

      2、明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器

      3、如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)

      4、"this(形参列表)"必须声明在类的构造器的首行

      5、在类的一个构造器中,最多只能声明一个"this(形参列表)" 

     

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    Codeforces: Empty Triangle
    hdu 3006 The Number of set
    hdu 3645 Code Management System
    进度条作控件代码
    NORMAL
    callback
    三种形状匹配脚本
    移动点动画
    脚本管理
  • 原文地址:https://www.cnblogs.com/niujifei/p/13773094.html
Copyright © 2011-2022 走看看