this 关键字
先看一段代码,并分析问题
public class Dog {
public String name;
public int age;
public Dog(String dName, int dAge) {
name = dName;
age = dAge;
}
public void info0() {
System.out.println(name + "It" + age + "It");
//问题:构造方法的输入参数名不是非常的好,
//如果能够将dName改成 name就好了,
//但是我们会发现按照变量的作用域原则,name的值就是null,怎么解决->this
}
}
public class This01 {
public static void main(String[] args) {
Dog dog1 = new Dog("大壮", 3);
System.out.println("dog1 的 hashcode=" + dog1.hashCode());
//dog1 调用了 info()方法
dog1.info();
System.out.println("============");
Dog dog2 = new Dog("大黄", 2);
System.out.println("dog2 的 hashcode=" + dog2.hashCode());
dog2.info();
}
}
class Dog {
String name;
int age;
// public Dog(String dName, int dAge){//构造器
// name = dName;
// age = dAge;
// }
//如果我们构造器的形参,能够直接写成属性名,就更好了
//但是出现了一个问题,根据变量的作用域原则
//构造器的 name 是局部变量,而不是属性
//构造器的 age 是局部变量,而不是属性
//==> 引出 this 关键字来解决
public Dog(String name, int age) {//构造器
//this.name 就是当前对象的属性 name
this.name = name;
//this.age 就是当前对象的属性 age
this.age = age;
System.out.println("this.hashCode=" + this.hashCode());
}
public void info() {//成员方法,输出属性 x 信息
System.out.println("this.hashCode=" + this.hashCode());
System.out.println(name + "\t" + age + "\t");
}
}
深入理解 this
为了进一步理解 this,我们再看一个案例 (This01.java)
this 的注意事项和使用细节
ThisDetail.java
1) this 关键字可以用来访问本类的属性、方法、构造器
2) this 用于区分当前类的属性和局部变量
3) 访问成员方法的语法:this.方法名(参数列表)
4) 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)
5) this 不能在类定义的外部使用,只能在类定义的方法中使用
public class ThisDetail {
public static void main(String[] args) {
// T t = new T();
// t.f2();
T t = new T();
t.f3();
}
}
class T {
String name ="jack";
int num =100;
public T() {
this("jack",10);
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();
}
public void f3(){
String name = "smith";
System.out.println("name="+name+" age="+ num);
System.out.println("name="+this.name+" age="+ this.num);
}
}
this 案例
定义 Person 类,里面有 name、age 属性,并提供 compareTo 比较方法,用于判断是否和另一个人相等,提供测试类TestPerson用于测试, 名字和年龄完全一样,就返回 true, 否则返回 false
public class Person {
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public boolean compareTo(Person p) {
return this.name.equals(p.name)&&this.age == p.age;
}
}
public class TestPerson {
public static void main(String[] args) {
Person person1 = new Person("mary",20);
Person person2 = new Person("smith",20);
System.out.println("person1和person2比较的结果 "+person1.compareTo(person2));
}
}