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(形参列表)" 

 

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