this关键字

发布于:2024-05-07 ⋅ 阅读:(30) ⋅ 点赞:(0)

this


概念:this 关键字是 Java常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,可以将this理解为一个指针,即谁调用该类的方法或属性,this就指向谁。

引出This

为什么我们需要this关键字?用以下案例对this进行引出

public class Test01{
    public static void main(String[] args){
    	Person p = new Person("胡歌",41);
        p.show();
    }
}
class Person{
    String names;
    int ages;
    public Person(String name,int age){
        names = name;
        ages = age
    }
    public void show(){
        System.out.println(names+"---"+ages);
    }
}

输出结果:

在这里插入图片描述

以上写法不会出现问题,但是当我们将成员属性的变量名改为和有参构造方法Person(String name,int age)相同时就会出现问题

例如:

public class Test01{
    public static void main(String[] args){
    	Person p = new Person("胡歌",41);
        p.show();
    }
}
class Person{
    String name;
    int age;
    public Person(String name,int age){
        name = name;
        age = age;
    }
    public void show(){
        System.out.println(name+"---"+age);
    }
}

运行结果:

在这里插入图片描述

为什么会出现以上情况?

原因:

  • 构造器的name是局部变量,不是属性,构造器的age也是局部变量,不是属性
  • name = name时两个name都是就近原则匹配的是构造器里面的局部变量name,实际上构造器里面变成了“胡歌=胡歌;41=41”并没有对上面的属性造成影响,成员属性的name依然为默认值null,age为默认值0。

解决办法:

 public Person(String name,int age){
        this.name = name;
        this.age = age;
   }

这样,this.name就是指的p对象的成员属性,而name就是来自于构造方法中的局部变量,age同理。

this的作用

  1. this.属性:调用本对象的成员属性
  2. this.方法:调用本对象的成员方法
  3. this():在构造方法的第一句调用另外一个构造方法

this.属性

代码案例:

class Person {
	//属性
	String name;
	char sex;
	int age;
	//构造方法 -- 有参构造
	public Person(String name,char sex,int age){
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Person p = new Person("胡歌",'男',41);
	}
}

在上述代码中 name、sex和 age为Person类的三个成员属性,通过this.name=name;this.sex=sex;this.age=age;将带参构造器中的值赋值给成员属性。

内存分析

在这里插入图片描述

this.方法名

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

代码实现:

class Person {
	//属性
	String name;
	char sex;
	int age;
	//构造方法 -- 有参构造
	public Person(String name,char sex,int age){
		this.name = name;
		this.sex = sex;
		this.age = age;
	}	
	//成员方法
	public void eat(){
		//this.属性:调用本对象的成员属性
		System.out.println(this.name + "吃饭");
	}
	public void sleep(){
		//this.属性:调用本对象的成员属性
		System.out.println(this.name + "睡觉");
	}
	public void writerCode(){
		//this.属性:调用本对象的成员属性
		System.out.println(this.name + "写代码");
	}
	public void study(){
		//this.方法:调用本对象的成员方法
		this.eat();
		this.writerCode();
		this.sleep();
	}
}
public class Test01 {
	public static void main(String[] args) {
		Person p = new Person("胡歌",'男',41);
		p.study();
	}
}

运行结果:

胡歌吃饭
胡歌写代码
胡歌睡觉

分析:

创建对象过后,p对象的成员属性name=“胡歌”;sex=‘男’;age=41;当执行p.study()后,this就指向了p,接着study()方法中调用this.eat();this.writerCode();和this.sleep()方法,其实就算是study()方法中调用的其他方法没有加this,编译器都会默认加上一个this。

this()构造方法

this( ) 用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。)

代码实现:

class Person {
	//属性
	String name;
	char sex;
	int age;
	//构造方法 -- 无参构造
	public Person(){
		//this():在构造方法的第一句调用另外一个构造方法
		this("彭于晏", '男', 46);
		System.out.println("Person的无参构造");
	}
	
	//构造方法 -- 有参构造
	public Person(String name,char sex,int age){
		this.name = name;
		this.sex = sex;
		this.age = age;
	}	
}

public class Test01 {
	public static void main(String[] args) {
		Person p = new Person();
	}
}

注意:

  • this关键字可以用来访问本类的属性、方法、构造器。
  • this用于区分当前类的属性和局部变量。
  • 访问成员方法的语法:this.方法名(参数列表)。
  • 访问构造器语法:this(参数列表);在构造方法中使用时必须放在第一行。
  • this不能在类定义的外部使用,只能在类定义的方法中使用。