Java 中 this 关键字的使用细节

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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值