Java中 this关键字详解

this关键字是Java中常用的关键字,可以用于任何实例方法内指向当前对象,也可以指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。
在Java中,当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能够在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且只和特定的对象关联,而不是类关联,同一个类的不同对象有不同的this

this关键字的作用主要有三个方面:
this调用本类中的属性,也就是类中的成员变量;
this调用本类中的其他方法;
this调用本类中的其它构造方法,调用时要放在构造方法的首行。

接下来,本文就从这个三个方面来阐述一下this关键字的具体应用:

一、this调用本类中的属性,也就是类中的成员变量(this.属性名)

在大部分的时候,普通方法访问其他方法、成员变量时无须使用this前缀,但是如果方法里有个局部变量和成员变量同名,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用this前缀。

例1

//先定义一个教师类Teacher
//定义的属性name、salary 和 age 的作用域是 private,因此在类的外部无法对它们的值进行设置。
public class Teacher {
    
    
    private String name;    // 教师名称
    private double salary;    // 工资
    private int age;    // 年龄

//为了解决上述的在类的外部无法对它们的值进行设置的问题,
//所以在Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。
// 创建构造方法,为上面的3个属性赋初始值
public Teacher(String name,double salary,int age) {
    
    
    this.name = name;    // 设置教师名称
    this.salary = salary;    // 设置教师工资
    this.age = age;    // 设置教师年龄
}
}

在Teacher类的构造方法中使用了this关键字属性 namesalaryage 赋值,this表示的是当前对象。this.name = name 语句表示的是一个复制语句,等号左边的this.name是指当前对象具有的变量name,等号右边的name表示参数传递过来得数值。
可以利用整段代码进行测试一下,代码如下

//先定义一个教师类Teacher
//定义的属性name、salary 和 age 的作用域是 private,因此在类的外部无法对它们的值进行设置。
public class Teacher {
    
    
    private String name;    // 教师名称
    private double salary;    // 工资
    private int age;    // 年龄

//为了解决上述的在类的外部无法对它们的值进行设置的问题,
//所以在Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。
// 创建构造方法,为上面的3个属性赋初始值
public Teacher(String name,double salary,int age) {
    
    
    this.name = name;    // 设置教师名称
    this.salary = salary;    // 设置教师工资
    this.age = age;    // 设置教师年龄
}
public static void main(String[] args) {
    
    
    Teacher teacher = new Teacher("王刚",5000.0,45);
    System.out.println("教师信息如下:");
    System.out.println("教师名称:"+teacher.name+"\n教师工资:"+teacher.salary+"\n教师年龄:"+teacher.age);
}
}

得到的结果

教师信息如下:
教师名称:王刚
教师工资:5000.0
教师年龄:45

需要注意的是:当一个类的属性(成员变量)名与访问该属性的方法参数方法名相同时,则需要使用this关键字来访问类中的属性,以区分类的属性和方法中的参数。

二、this调用本类中的其他方法(this.方法名)

this关键字最大的作用就是让类中的一个方法,访问该类里的另一种方法或实例变量。

扫描二维码关注公众号,回复: 11949950 查看本文章

例2

/**
 * 第一种定义Dog类方法
 **/
 //定义了一个Dog类,这个Dog对象的run()方法需要调用它的jump()方法,方法如下:
public class Dog {
    
    
    // 定义一个jump()方法
    public void jump() {
    
    
        System.out.println("正在执行jump方法");
    }
    // 定义一个run()方法,run()方法需要借助jump()方法
    public void run() {
    
    
        Dog d = new Dog();
        d.jump();
        System.out.println("正在执行 run 方法");
    }
}

在上述的代码中,直接在Dog类中定义的 run()jump() 方法,然后在run方法中直接通过 d.jump() 来调用 jump() 方法。
另一方法,还可以通过创建Dog对象,并调用该对象的 run() 方法,例如:

public class DogTest {
    
    
    public static void main(String[] args) {
    
    
        // 创建Dog对象
        Dog dog = new Dog();
        // 调用Dog对象的run()方法
        dog.run();
    }
}

在上述的程序中,一共产生了两个Dog对象,在Dog类的 run() 方法中,程序创建了一个Dog对象,并使用名为 d 的引用变量来指向该Dog对象。在DogTest的 main() 方法中,程序再次创建了一个Dog对象,并使用名为 dog 的引用变量来指向Dog对象。

但是,现在我们需要去思考两个问题
1)第一个问题:在 run() 方法中调用 jump() 方法时是否一定需要一个Dog对象呢?

答案: 是肯定的,因为没有使用static修饰的成员变量和方法都必须使用对象来调用。

2)第二个问题:Dog类定义是当一个Dog对象调用 run() 方法时,run()方法需要依赖它自己的 jump() 方法,与第一种定义类的相比,更符合实际情形。

答案: 在现实世界里,对象的一个方法依赖于另一个方法的情形很常见,例如,吃饭方法依赖于拿筷子方法,写程序方法依赖于敲键盘方法。这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 run( ) 方法改为如下形式也完全正确。

public void run() {
    
    
    jump();
    System.out.println("正在执行run方法");
}

大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 这个前缀的效果是完全一样的。但是呢,省略 this 前缀只是一种假象,虽然程序员省略了调用 jump() 方法之前的 this,但实际上这个 this 依然是存在的。

注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用并且 Java 语法规定,静态成员不能直接访问非静态成员。

三、this调用本类中的其它构造方法,调用时要放在构造方法的首行。(this.访问构造方法)

this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。)括号中可以有参数,如果有参数就是调用指定的有参构造方法。

例3

//定义一个学生Student类,使用this()调用构造方法给name赋值
public class Student {
    
    
    String name;
    // 无参构造方法(没有参数的构造方法)
    public Student() {
    
    
        this("张三");
    }
    // 有参构造方法
    public Student(String name) {
    
    
        this.name = name;
    }
    // 输出name和age
    public void print() {
    
    
        System.out.println("姓名:" + name);
    }
    public static void main(String[] args) {
    
    
        Student stu = new Student();
        stu.print();
    }
}

输出结果

姓名:张三

注意:

  1. this( ) 不能在普通方法中使用,只能写在构造方法中。
  2. 在构造方法中使用时,必须是第一条语句。

客官,给个一键三连吧,呜呜呜wwuwu

猜你喜欢

转载自blog.csdn.net/qq_39350172/article/details/109139776