目录
this的引出
public class This01{
public static void main(String[]args){
Dog dog = new Dog("大壮",3);
dog.info();
}
}
class Dog{ //类
String name;
int age;
public Dog(String dName, int dAge){ //构造器
name = dName;
age = dAge;
}
}
public void info(){//成员方法 输出属性/信息
System.out.println("它的名字是"+dName+"\t"+"年龄是"+dAge);
}
他的名字是大壮 年龄是3
这是一个可以输出一只可爱dog的名字和年龄的代码,我们现在将目光聚焦于这段代码的构造器部分,我们思考一下如果把构造器的形参列表改成和属性名一样会怎样。
class Dog(String name, int age){
name = name;
age = age;
}
修改构造器后程序的输出结果:
它的名字是null 年龄是0
这是为什么呢?原来因为变量的作用域原则,构造器的name和age都是局部变量,不是属性,相当于在构造器内让自己等于自己了,属性没有用上。那么该怎么解决这个问题呢,这就引出我们今天要学的this了。
this入门
什么是this?
Java虚拟机会给每个对象分配this,代表当前对象。
这就类似于我们每个人都有一双明亮的眼睛,小明说:“我的眼睛很大。" 这句话里的”我的“就指的是小明,小红说:”我的眼睛也很大。“ 这句话里的”我的“就指的是小红了。
我们可以用this来解决上面构造器出现的问题:
public Dog(String name, int age){
//this.name就是当前对象的属性name,而不再是局部变量
this.name = name;
//this.age就是当前对象的属性age,而不再是局部变量
this.age = age;
}
这样问题就解决啦。
this的本质
字符串放在常量池,这张图可以看出每个对象都有自己的this,这个this指向对象本身,且二者地址一样。
this小结
简单的说,哪个对象调用,this就代表哪个对象。
info里、构造器里、dog里输出的this的hashCode值都相同。
this的注意细节
1. this关键字可以访问本类的属性、方法、构造器。
2. this可以用于区分当前类的属性和局部变量。
3. 访问成员方法的语法:this.方法名(参数列表)。
public class Main{
public static void main(String[]args){
T t1 = new T();
t1.f1();
}
}
class T{
public void f1(){
System.out.println("f1()方法被调用...”)
}
}
4. 访问构造器的语法:this(参数列表);注意只能在构造器中使用!(即只能在一个构造器中访问另一个构造器,而如果有这句语法的话,this访问的这句话必须放在第一句,这一点在后面寄存中会讲,下面举例)
classT{
public T(){
this("jack",100);//必须放在第一句
System.out.println("T()构造器");
}
public T(String name, int age){
System.out.println("T(String name, int age)构造器");
}
}
5. this不能在类定义的外部使用,只能在类定义的方法中使用。
课堂练习
pubilc class TestPerson{
public static void main(String[]args){
Person p1 = new Person("marry", 20);
Person p2 = new Person("jack", 30);
System.out.println("p1、p2的比较结果="+p1.compareTo(p2));
}
}
class Person{
String name;
int age;
//构造器
public Person(String name, int age){
this.name = name;
this.age = age;
}
//compareTo比较方法
public boolean compare To(Person p){
return this.name.equals(p.name) && this.age ==p.age;
}
}