this关键字

this关键字

先看一段代码,并分析问题

This01.java

public class This {
  public static void main(String[] args) {
      Dog01 dog1 = new Dog01("brave",3);
      dog1.info();
  }
}

class Dog01{ //类

  String name;
  int age;
  //此时我们将构造器的参数改成了和属性变量一样的名称
  //就会出现一个问题,即根据变量的作用域规则
  //构造器的name age就是局部变量,而不是属性,因此我们传参进入的值不会在info方法中打印出来
  //引出this关键字来解决
  public Dog01(String name,int age){//构造器
      name = name;
      age = age;
  }

  public void info(){//成员方法,输出属性信息
      System.out.println(name + "\t" + age + "\t");
  }
}

问题:构造方法的输入参数名不是非常的好,如果能够将dName改成name就好了,但是我们 会发现按照变量的作用域原则,name的值就是nul,怎么解决->this

什么是this?

java虚拟机会给每个对象分配this,代表当前对象。坦白的讲,要明白this不 是件容易的事,我给大家打一个比方。[上帝创世界小故事]

 

使用this解决前面变量命名问题

具体看代码

this.name = name;
this.age = age;
//this.name/age表示当前对象的属性,而不是局部变量了

需要注意的是 ,不同的类的this代表不同类对象的属性

 

 

this的注意事项和使用细节

ThisDetail.java

1.this关键字可以用来访问本类的属性、方法、构造器

2.this用于区分当前类的属性和局部变量

3.访问成员方法的语法:this.方法名(参数列表)

4.访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中调用另外一个构造器 ,必须放到第一条语句)

5.this不能在类定义的外部使用,只能在类定义的方法中使用。

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

  }
}

class T{
  //细节:访问成员方法的语法:this.方法名(参数列表);
  public void f1(){
      System.out.println("f1()方法...");
  }

  public void f2(){
      System.out.println("f2()方法...");
      //调用本类的f1
      //第一种方式
      f1();
      //第二种方式
      this.f1();
  }

  public T(){
      this("jack",20);
      //2.使用this方法传入对应的参数即可实现
      //注意:如果有构造器的this方法必须要放置到首个语句
      System.out.println("T()构造器");
      //1.这里如果想要访问到public T(String name,int age)构造器

  }
  public T(String name,int age){
      System.out.println("T(String name,int age)构造器");
  }
}

再来看看这个代码

public void f3(){
  String name = "smith";
  //传统方式
  System.out.println("名字为"+name+"年龄为"+age);
  //使用this访问本类的属性
  System.out.println("名字为"+this.name+"年龄为"+this.age);

}

当调用到f3这个方法的时候就会发现打印年龄的时候 ,二者输出的年龄都是类的属性 年龄

但是一旦输出名字就会发现传统方式的式"smith" ,这是因为传统方式采用的是"就近原则"即使用最近作作用域的变量 ,而this不同 ,采用的就只能是类中的属性

 

 

●this的课堂案例

TestPerson.java

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

public class TestPerson {
  public static void main(String[] args) {
      Personz z1 = new Personz("mike",20);
      Personz z2 = new Personz("mike",20);
      System.out.println(z1.compareTo(z2));
      //此时传参的对象就为z2,z1对象和z2对象的属性进行对比


  }
}

class Personz{
//创建一个Personz类
  String name;
  int age;
  //创建类的属性

  public Personz(String name,int age){
      this.name = name;
      this.age = age;
      //创建类的构造器,添加this用于区分属性和传进来的形参
  }

  public boolean compareTo(Personz p){
  //返回类型位Boolean,传入的参数为一个Person对象
//       if (this.name.equals(p.name) && this.age == p.age){
//判断当前的对象的name和传入的p对象的name
//并且age也是一致的
//           return true;
//       }else {
//           return false;
//       }
      return this.name.equals(p.name) && this.age == p.age;
      //将上面的判断语句合称为一句
  }

}
posted @   comia  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示