Java this关键字

java this关键字可以有很多用法。在Java中,这是引用当前对象的引用变量。

1 Java this关键字的用法

Java this关键字有6种用法:

  1. this引用当前类的实例变量
  2. this调用当前类的方法
  3. this()调用当前类的构造方法
  4. this作为普通方法调用的参数
  5. this作为构造方法调用的参数
  6. this从方法返回当前类的实例

建议:如果你是Java的初学者,则重点掌握this关键字的前三种用法。

2 this引用当前类的实例变量

this关键字可用于引用当前的类实例变量。如果实例变量和参数之间存在歧义,则使用this关键字可解决歧义问题。

2.1 不使用this关键字的情况

先看看以下示例在没有使用this关键字的情况下会产生什么问题:

/**
 * 一点教程网 - http://www.yiidian.com
 */
//没有使用this关键字的情况
class Student{
    int rollno;
    String name;
    float fee;
    Student(int rollno,String name,float fee){
        rollno=rollno;
        name=name;
        fee=fee;
    }
    void display(){
        System.out.println(rollno+" "+name+" "+fee);
    }
}
class TestThis1{
    public static void main(String args[]){
        Student s1=new Student(111,"张三",5000f);
        Student s2=new Student(112,"李四",6000f);
        s1.display();
        s2.display();
    }
}

输出结果为:

0 null 0.0
0 null 0.0

在上面的示例中,参数(形式参数)和实例变量相同。因此,我们使用this关键字来区分局部变量和实例变量。

2.2 使用this关键字解决问题

/**
 * 一点教程网 - http://www.yiidian.com
 */
//使用this关键字解决问题
class Student{
    int rollno;
    String name;
    float fee;
    Student(int rollno,String name,float fee){
        this.rollno=rollno;
        this.name=name;
        this.fee=fee;
    }
    void display(){
        System.out.println(rollno+" "+name+" "+fee);
    }
}

class TestThis2{
    public static void main(String args[]){
        Student s1=new Student(111,"张三",5000f);
        Student s2=new Student(112,"李四",6000f);
        s1.display();
        s2.display();
    }
}

输出结果为:

111 张三 5000.0
112 李四 6000.0

如果局部变量(形式参数)和实例变量不同,像下面示例一样,则无需this关键字区分:

2.3 不需要this关键字的情况

/**
 * 一点教程网 - http://www.yiidian.com
 */
//如果参数和实例变量名称不同,则无需使用this关键字
class Student{
    int rollno;
    String name;
    float fee;
    Student(int rollno,String name,float fee){
        this.rollno=rollno;
        this.name=name;
        this.fee=fee;
    }
    void display(){
        System.out.println(rollno+" "+name+" "+fee);
    }
}

class TestThis2{
    public static void main(String args[]){
        Student s1=new Student(111,"张三",5000f);
        Student s2=new Student(112,"李四",6000f);
        s1.display();
        s2.display();
    }
}  

输出结果为:

111 张三 5000.0
112 李四 6000.0

开发建议:对变量使用有意义的名称是一种更好的方法。因此,我们对实例变量和参数实时使用相同的名称,建议使用this关键字来区分它们。

3 this调用当前类的方法

你可以使用this关键字调用当前类的方法。如果不使用this关键字,则编译器会在调用该方法时自动添加this关键字。让我们来看一个例子:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class A{
    void m(){
        System.out.println("hello m");
    }
    void n(){
        System.out.println("hello n");
        m();//这行代码的作用和this.m()是一样的
        this.m();
    }
}
class TestThis4{
    public static void main(String args[]){
        A a=new A();
        a.n();
    }}

输出结果为:

hello n
hello m
hello m

4 this()调用当前类的构造方法

this() 构造方法调用可用于调用当前类的构造方法。它用于重用构造方法。换句话说,它用于构造方法的链接。

从带参数的构造方法中调用默认无参的构造方法:

/**
 * 一点教程网 - http://www.yiidian.com
 */
//从带参数的构造方法中调用默认无参的构造方法
class A{
    A(){System.out.println("hello a");}
    A(int x){
        this();
        System.out.println(x);
    }
}
class TestThis5{
    public static void main(String args[]){
        A a=new A(10);
    }
}

输出结果为:

hello a
10

从默认无参的构造方法调用带参数的构造方法:

/**
 * 一点教程网 - http://www.yiidian.com
 */
//从默认无参的构造方法调用带参数的构造方法
class A{
    A(){
        this(5);
        System.out.println("hello a");
    }
    A(int x){
        System.out.println(x);
    }
}
class TestThis6{
    public static void main(String args[]){
        A a=new A();
    }
}

输出结果为:

5
hello a

4.1 this() 构造方法调用的实际用法

this() 构造方法调用实际上可以用于重用构造方法。我们来看下面给出的示例,该示例显示this关键字的实际用法。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//使用this关键字重用构造方法
class Student{
    int rollno;
    String name,course;
    float fee;
    Student(int rollno,String name,String course){
        this.rollno=rollno;
        this.name=name;
        this.course=course;
    }
    Student(int rollno,String name,String course,float fee){
        this(rollno,name,course);//重用构造方法
        this.fee=fee;
    }
    void display(){
        System.out.println(rollno+" "+name+" "+course+" "+fee);
    }
}
class TestThis7{
    public static void main(String args[]){
        Student s1=new Student(111,"张三","java");
        Student s2=new Student(112,"李四","java",6000f);
        s1.display();
        s2.display();
    }
}

输出结果为:

111 张三 java 0.0
112 李四 java 6000.0

注意:调用this() 必须是构造方法中的第一条语句。

下面是一个错误示范,开发中要注意:

/**
 * 一点教程网 - http://www.yiidian.com
 */
//调用this() 必须是构造方法中的第一条语句。
class Student{
    int rollno;
    String name,course;
    float fee;
    Student(int rollno,String name,String course){
        this.rollno=rollno;
        this.name=name;
        this.course=course;
    }
    Student(int rollno,String name,String course,float fee){
        this.fee=fee;
        this(rollno,name,course);//这行代码会编译报错
    }
    void display(){
        System.out.println(rollno+" "+name+" "+course+" "+fee);
    }
}
class TestThis8{
    public static void main(String args[]){
        Student s1=new Student(111,"张三","java");
        Student s2=new Student(112,"李四","java",6000f);
        s1.display();
        s2.display();
    }
}

5 this作为普通方法调用的参数

this关键字也可以在方法中作为参数传递。它主要用于事件处理。让我们来看一个例子:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class S2{
    void m(S2 obj){
        System.out.println("方法被执行...");
    }
    void p(){
        m(this);
    }
    public static void main(String args[]){
        S2 s1 = new S2();
        s1.p();
    }
}

输出结果为:

方法被执行...

6 this作为构造方法调用的参数

我们也可以在构造方法中传递this关键字。如果我们必须在多个类中使用一个对象,这种语法就很有用。让我们来看一个例子:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class B{
    A4 obj;
    B(A4 obj){
        this.obj=obj;
    }
    void display(){
        System.out.println(obj.data);//调用A4类的data属性
    }
}

class A4{
    int data=10;
    A4(){
        B b=new B(this);
        b.display();
    }
    public static void main(String args[]){
        A4 a=new A4();
    }
}  

输出结果为:

10

7 this从方法返回当前类的实例

我们可以将this关键字从方法返回当前类的实例。在这种情况下,方法的返回类型必须是类的类型(非原始类型)。让我们来看一个例子:

7.1 this从方法返回当前类的实例的语法

return_type method_name(){  
    return this;  
}

7.2 this从方法返回当前类的实例的示例

/**
 * 一点教程网 - http://www.yiidian.com
 */
class A{
    A getA(){
        return this;
    }
    void msg(){
        System.out.println("Hello java");
    }
}
class Test1{
    public static void main(String args[]){
        new A().getA().msg();
    }
}  

输出结果为:

Hello java

7.3 验证this关键词

让我们证明this关键字引用了当前的类实例变量。下面示例中,我们打印两个变量,并且这两个变量的输出是相同的。

/**
 * 一点教程网 - http://www.yiidian.com
 */
class A5{
    void m(){
        System.out.println(this);//this和obj的内存ID是一样的,证明是同一个对象
    }
    public static void main(String args[]){
        A5 obj=new A5();
        System.out.println(obj);//打印obj对象的内存ID
        obj.m();
    }
}  

输出结果为:

A5@14ae5a5
A5@14ae5a5

 

推荐好课