Java基础32 this关键字

· 什么是this?

假如在一个类中使用变量表示年龄时,构造方法中使用的是pAge,成员变量使用的是age,这样程序的可读性很差。这时我们将一个类中表示年龄的变量进行统一的命名,例如都声明为age,但这样做又会导致另一个新的问题:成员变量和局部变量的名字冲突,在方法中无法访问成员变量age。所以为了解决这个问题,Java中提供了一个关键字 “this”指代当前对象,用在方法中访问对象的其他成员。

· this的使用

1.this.属性名

指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)

例如:

class Person{
    int age;
    public Person(int age){
         this.age = age;
    }
    public int getAge(){
         return this.age;
    }
}

上面的代码中,构造方法的参数被定义为age,它是一个局部变量,在类中还定义了一个成员变量,名称也是age。在构造方法中如果使用"age",则是访问局部变量,但如果使用"this.age"则是访问成员变量(属性)。

2.this.方法名

用来访问本类的成员方法

例如:在下面的 “speak()” 方法中,使用this关键字调用 “openMouth()” 方法。

class Person{
   public void openMouth(){
       ...
   }  
   public void speak(){
       this.openMouth();
   }
}

注意,此处的this关键字可以省略不写,也就是在上面的代码中,“this.openMouth()” 与 "openMouth()"的效果是完全一样的。

3. this();

访问本类的构造方法

构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在一个构造方法中使用 “this([参数 1, 参数 2…])” 的形式来调用其他的构造方法。

例如:

class Person{
    public Person(){
       System.out.println("无参的构造方法被调用了");  
    }
    public Person(String name){
       this();   //调用无参构造方法
       System.out.println("有参的构造方法被调用了");  
    }
}

public class t{
    public static void main(String[] args){
        Person p = new Person("coco"); //实例化对象
    }
}

Console:
无参的构造方法被调用了
有参的构造方法被调用了

在实例化Person对象时,调用了有参的构造方法,在该方法中通过 this() 调用了无参的构造方法,因此运行结果中显示两个构造方法都被调用了。

在 this 调用构造方法注意的点:

  1. ()中可以有参数的 如果有参数 就是调用指定的有参构造
  2. 只能在构造方法中使用this调用其他的构造方法,不能再成员方法中使用。
  3. 在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次。

· this的注意事项及使用细节

  1. this关键字可以用来访问本类的属性、方法、构造器
  2. this用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器的语法:this(参数列表); 【注意只能在构造器中使用,且必须放在第一行】
  5. this不能在类定义的外部使用,只能在类定义的方法中使用。

· this的练习题

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

代码实现:

public class Test{
     public static void main(String[] args){
         Person p1 = new Person("mary",20);
         Person p2 = new Person("mary",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 conpareTo(Person p){
      // 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;
    }
}


Console:
p1和p2比较的结果:false
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值