Java笔记_this关键字

this关键字

引出this的使用场景:

案例一(通过案例一来引出this的使用场景):

/**
 * @ClassName This02
 * @Description TODO
 * @Author Orange
 * @Date 2021/4/21 15:17
 * @Version 1.0
 **/
public class This02 {
    public static void main(String[] args) {
        Cat cat1 = new Cat("大壮", 3);
        cat1.info();
    }
}


class Cat {

    int age;
    
    String name;
    
    
    //如果我们的构造器的形参能够直接写成属性名,就更加方便了(起名更加简单)
//  public Cat(String dName,int dAge) {// 构造器
//      name = dName;
//      age = dAge;
//  }
    //输出结果如下:
    //大壮	3	

    
    
    //于是有以下的尝试 ↓
//  public Cat(String name, int age) {//构造器
//      name = name;
//      age = age;
//  }
    
    //输出结果如下:
    //null	0
    // 原因分析:因为一个是name是形参name,一个是属性name,
    // 这里只是将属性name(值为null)再赋给属性name了而已!

    
    
    //于是我们可以引出相应的解决方法— — — — this!
    public Cat(String name, int age) {              //构造器
        this.name = name;                           //this.name指的是所调用对象的属性
                                                    //而name指的则是形参 name !
        this.age = age;
    }
    
    //输出结果如下:
    //大壮	3	


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

}

案例二(通过案例二来深入了解this在内存中的使用情况):

/**
 * @ClassName This01
 * @Description TODO
 * @Author Orange
 * @Date 2021/4/21 14:12
 * @Version 1.0
 **/
public class This01 {
    public static void main(String[] args) {

    //hashCode是一种哈希表值,它虽不是真是的地址值
    //但是它是由地址生成的一个特殊的对应值,可以通过它来观察this在使用原理
        
    Dog_dog FG = new Dog_dog("峰哥",3);
    System.out.println("FG的hashCode = " + FG.hashCode());
    FG.info();

    Dog_dog FGNB = new Dog_dog("峰哥牛逼!", 4);
    System.out.println("FGNB的hashCode = " + FGNB.hashCode());
    FGNB.info();
    
    }

}

class Dog_dog {

    int age;                                //属性age
    String name;                            //属性name

    public Dog_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(name + "\t" + age);
    }
}

/*
程序运行结果:
-------------------------------
this.hashCode = 460141958
FG的hashCode = 460141958
峰哥	3
this.hashCode = 1163157884
FGNB的hashCode = 1163157884
峰哥牛逼!	4
 -------------------------------
*/

练习

/**
 * @ClassName This_Exercise01
 * @Description TODO
 * @Author Orange
 * @Date 2021/4/22 10:06
 * @Version 1.0
 **/

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


public class This_Exercise01 {
    public static void main(String[] args) {
        Person p1 = new Person("峰哥", 20);
        Person p2 = new Person("峰哥", 20);

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



}

/*
程序运行结果:
-----------------------
p1和p2比较的结果 = true
 ----------------------
*/

小结

  通过案例二可以知道this就是访问本类的成员方法
  但有点不好理解,我的理解就是this相当于一个“对象的形参”,当外部创建了一个本类的新对象时,会将那个对象所指向的堆地址(对象所在的区域)值赋给this,让其也指向相同的堆地址区域,从而实现对象的属性和方法传递的效果,如果外部又有新的对象被创建,那么this又可以指向新对象所指向的地址区域。
  最最最通俗易懂的说法:
  青哥(对象一)说:“我的眼睛很大”,这个"我"(this)指的是青哥(对象一),眼睛(属性)是青哥的眼睛,大(方法)是青哥的眼睛大;
  而峰哥(对象二)说:"我的眼睛很小",同样是"我",这个"我"(this)却指的是峰哥(对象二),眼睛(属性)是峰哥的眼睛,小(方法)是峰哥的眼睛小.

posted @ 2021-04-20 17:07  奔跑的乌鸦  阅读(55)  评论(0)    收藏  举报