【Java】this关键字详解(用入门+本质+注意细节+课堂练习帮你拿下this!)

目录

this的引出

this入门

什么是this?

this的本质

this小结

this的注意细节

课堂练习 


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;
}
 }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值