Java:this

package com.demo.day;

public class This01 {
    public static void main(String[] args) {
        Dog1 dog1 = new Dog1("耗子",3);
        dog1.info();
    }
}
class Dog1{
    String name;
    int age;
//    public Dog1(String dName,int dAge){
//        name = dName;
//        age = dAge;
//    }
    //出现了一个问题,根据变量的作用域原则
    //构造器的name 就是局部变量,而不是属性
    //引出 ————> this 关键字
    public Dog1(String name,int age){
        this.name = name;   //当前对象的属性name = 局部变量name
        this.age = age;     //当前对象的属性age = 局部变量age
    }
    //如果我们构造器的形参,能够直接写成属性名就更好了
    public void info(){
        System.out.println(name + "\t" + age + "\t");
    }
}

什么是this

java虚拟机会给每个对象分配this,代表当前对象。

使用hashCode()方法来查看this是否是本类的引用;

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

package com.demo.day;

public class This01 {
    public static void main(String[] args) {
        Dog1 dog1 = new Dog1("耗子",3);
        Dog1 dog2 = new Dog1("三花",2);
        //调用hashCode()方法
        System.out.println("dog1的hashcode:" + dog1.hashCode());
        System.out.println("dog2的hashcode:" + dog2.hashCode());
//        dog1.info();
    }
}
class Dog1{
    String name;
    int age;
//    public Dog1(String dName,int dAge){
//        name = dName;
//        age = dAge;
//    }
    //出现了一个问题,根据变量的作用域原则
    //构造器的name 就是局部变量,而不是属性
    //引出 ————> this 关键字
    public Dog1(String name,int age){
        this.name = name;   //当前对象的属性name = 局部变量name
        this.age = age;     //当前对象的属性age = 局部变量age
        //调用hashCode()方法
        System.out.println("this.hashcode = " + this.hashCode());
    }
    //如果我们构造器的形参,能够直接写成属性名就更好了
    public void info(){
        System.out.println(name + "\t" + age + "\t");
    }
}

输出结果:

this.hashcode = 1324119927
this.hashcode = 81628611
dog1的hashcode:1324119927
dog2的hashcode:81628611

this小结

简单的说,哪个对象调用,this就代表哪个对象

this使用细节

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

下面代码将上述细节呈现

package com.demo.day;

public class thisDetail {
    public static void main(String[] args) {
//        T1 t1 = new T1();
//        t1.f2();
        T1 t2 = new T1();
        t2.f3();
    }
}
class T1{
    String name = "Tom";
    int num;
    //细节:访问成员方法的语句:this.方法名(参数列表)
    //注意:访问构造器语法:this(参数列表);必须放在构造器的第一条语句
    //对构造器的访问 注意只能在构造器中使用,即不能成员方法访问构造器,只能构造器互相访问
    public T1(){
        //从这里去访问 T1(String name,int age) 构造器
        this("jack",21);//对this的调用必须是构造器中的第一个语句
        System.out.println("T1() 构造器");
    }
    public T1(String name,int age){
        System.out.println("T1(String name,int age) 构造器");
    }

    public void f1(){
        System.out.println("f1() 方法..");
    }
    public void f2(){
        System.out.println("f2() 方法..");
        //调用本类的 f1
        //第一种方式
        f1();
        //第二种方式
        this.f1();
    }
    //this 关键字可以用来访问本类的属性
    public void f3(){
        String name = "smith";//变量作用域的就近原则会导致下面的输出不同
        //传统方式
        System.out.println("name=" + name + "\tnum=" + num);
        //也可以使用this访问属性
        System.out.println("name=" + this.name + "\tnum=" + this.num);
    }
}

测试

package com.demo.day;

public class TestPerson {
    public static void main(String[] args) {
        Person3 p = new Person3("smith",21);
        Person3 p2 = new Person3("tom",21);
        System.out.println(p.compareTo(p2));
    }
}
class Person3{
    String name;
    int age;
    Person3(String name,int age){
        this.name = name;
        this.age = age;
    }
    public boolean compareTo(Person3 p){
//        if (this.name.equals(p.name) && this.age == p.age){
//            return true;
//        }
        return this.name.equals(p.name) && this.age == p.age;
    }
}

posted @ 2023-05-16 00:54  Hello_world_名字被取了  Views(12)  Comments(0Edit  收藏  举报