JAVA this关键字


this关键字

如果我们构造器的形参,能够直接写成属性名,就更好了,方便阅读,但是根据变量的作用域原则

  • 构造器name 就是这个方法中的局部变量,而不是属性了
  • 构造器age 就是这个方法中的局部变量,而不是属性了

即出了这个方法就会销毁,由此引出this关键字

package This_Practice;

public class ThisDemo01 {
	public static void main(String[] args) {
		Dog dog1 = new Dog("大壮",3);
		dog1.info();//大壮 3
	}
}

class Dog{

	String name;
	int age;
	//如果我们构造器的形参,能够直接写成属性名,就更好了
	//但是出现了一个问题,根据变量的作用域原则
	//1.构造器name 就是这个方法中的局部变量,而不是属性了
	//2.构造器age 就是这个方法中的局部变量,而不是属性了
	//出了这个方法就会销毁,
	//那要怎么才能提高代码的可读性呐
	//使用this关键字
	public Dog(String name, int age) {//构造器
		//this.name 就是当前对象的属性,即成员变量
		this.name = name;
		//this.age 就是当前对象的属性,即成员变量
		this.age = age;
		//谁在调用这个构造器,那么它的this指的就是哪一个成员方法
	}
	
	
	public void info() {//成员方法
		System.out.println("姓名"+ "\t" + "年龄");
		System.out.println(name + "\t" + age);
	}
}

深入理解this

每创建一个对象,就会给该对象分配一个this,代表当前对象

package This_Practice;

public class ThisDemo01 {
	public static void main(String[] args) {
		Dog dog1 = new Dog("大壮",3);
		System.out.println("dog1的hashcode=" + dog1.hashCode());
		dog1.info();//大壮 3
		
		Dog dog2 = new Dog("大黄",2);
		System.out.println("dog2的hashcode=" + dog2.hashCode());
		dog2.info();//大黄 2
		System.out.println();
	}
}

class Dog{

	String name;
	int age;
	//如果我们构造器的形参,能够直接写成属性名,就更好了
	//但是出现了一个问题,根据变量的作用域原则
	//1.构造器name 就是这个方法中的局部变量,而不是属性了
	//2.构造器age 就是这个方法中的局部变量,而不是属性了
	//出了这个方法就会销毁,
	//那要怎么才能提高代码的可读性呐
	//使用this关键字
	public Dog(String name, int age) {//构造器
		//this.name 就是当前对象的属性,即成员变量
		this.name = name;
		//this.age 就是当前对象的属性,即成员变量
		this.age = age;
		//谁在调用这个构造器,那么它的this指的就是哪一个成员方法
		
	}
	
	
	public void info() {//成员方法
		System.out.println("this的hashcode="+this.hashCode());
		System.out.println("姓名"+ "\t" + "年龄");
		System.out.println(name + "\t" + age);
	}
}

内存图:

运行效果图

this小结:

  • 简单的说,哪个对象调用,this就代表哪个对象

注意事项和细节

  1. this 关键字可以用来访问本类的属性、方法、构造器
  2. this 用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表);

代码如下

package This_Practice;

public class ThisDetail {
	public static void main(String[] args) {
		T t1 = new T();
		t1.f2();
	}
}


class T{
	
	//访问成员方法的语法:this.方法名(参数列表);
	public void f1() {
		System.out.println("f1()方法..");
	}
	
	public void f2() {
		System.out.println("f2()方法..");
		//调用被类的f1方法
		//第一种方式
		f1();
		//第二种方式
		this.f1();
        这两种调用是有区别的
	}
}
  • 注意这两种调用方式是有区别的
  1. 访问构造器语法
    • this(参数列表);
    • 注意
      • 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
      • 如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
package This_Practice;

public class ThisDetail {
	public static void main(String[] args) {
		T t1 = new T();
		t1.f2();
	}
}


class T{
	
	
	/*
	 * 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
	 * 注意:
	 *  如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
	 */
	
	public T() {
		//这里去访问 T(String name,int age),
		this("jack",100);
		System.out.println("T()构造器");
	}
	
	public T(String name,int age) {
		System.out.println("T(String name,int age)构造器");
	}
	
	//访问成员方法的语法:this.方法名(参数列表);
	public void f1() {
		System.out.println("f1()方法..");
	}
	
	public void f2() {
		System.out.println("f2()方法..");
		//调用被类的f1方法
		//第一种方式
		f1();
		//第二种方式
		this.f1();
	}
}
  1. this不能在类定义的外部使用,只能在类定义的方法中使用
package This_Practice;

public class ThisDetail {
	public static void main(String[] args) {
		T t1 = new T();
		t1.f2();
		System.out.println();
		t1.f3();
	}
}


class T{
	
	String name = "jack";
	int age = 10;
	
	/*
	 * 只能在构造器中使用(即只能在构造器中访问另外一个构造器)
	 * 注意:
	 *  如果有this(参数列表) ——访问构造器的语法,必须放在第一条语句
	 */
	
	public T() {
		//这里去访问 T(String name,int age),
		this("jack",100);
		System.out.println("T()构造器");
	}
	
	public T(String name,int age) {
		System.out.println("T(String name,int age)构造器");
	}
	
	//访问成员方法的语法:this.方法名(参数列表);
	public void f1() {
		System.out.println("f1()方法..");
	}
	
	public void f2() {
		System.out.println("f2()方法..");
		//调用被类的f1方法
		//第一种方式
		f1();
		//第二种方式,通过this访问方法
		this.f1();
	}
	
	//通过this 关键字可以用来访问本类的属性、方法、构造器
	public void f3() {
		String name = "smith";
		int age = 30;
		//传统方式,遵循就近原则,有没有同名的局部变量
		System.out.println("name=" + name +"\nage=" + age);//输出smith,30
		//this关键字访问
		System.out.println("name=" + this.name +"\nage=" + this.age);//输出属性,jack,10
	}
}

运行效果

练习

题目:定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类 TestPerson,用于测试, 名字和年龄完全一样,就返回 true, 否则返回 false

package This_Practice;

public class ThisExercise {
	public static void main(String[] args) {
		TestPerson p = new TestPerson();
		p.test();
	}
}

//定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类 TestPerson
//用于测试, 名字和年龄完全一样,就返回 true, 否则返回 fals

/*
 * person 类
 * 属性:姓名,年龄
 * 方法:比较两个人是否一样
 */
class Person{
	String name;
	int age;
	
	//构造器
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public boolean compareTo(Person p) {
		//用当前的成员变量的值对比 传进来的对象成员变量的值,是就是return true,否就return flase
//		if(this.name.equals(p.name) && this.age == p.age) {
//			return true;
//		}else {
//			return false;
//		}
		
		return this.name.equals(p.name) && this.age == p.age;
	}
}

class TestPerson{
	
	public void test() {
		Person p1 = new Person("小杨",21);
		Person p2 = new Person("小杨",21);
		if(p1.compareTo(p2)) {
			System.out.println("是同一个人");
		}else {
			System.out.println("不是同一个人");
		}
	}
	
}