Java 基础 --- this

this 代表本类对象的 引用 (地址)

  • 区分 参数变量实例变量
  • 在构造函数中 调用 其他构造函数

1 this出现的原因

当方法中参数的变量名实例变量的变量名 相同时,则需要使用 this.变量名 来表示实例变量。

class Person{
  Person(String name)   
    {
        name = name; // 这就是 局部变量和成员变量 重名了
        // 一个在栈中,一个在堆中,互不影响,本来没问题,但是,
        // 在使用的时候,出问题,所以要做一个区分,出现了 this
    }
}

class ThisDemo 
{
    public static void main(String[] args) 
    {

        Person p1 = new Person("aa");// 输出结果是 null,为什么
    }       
}

new Person("aa"); --- 去找函数Person(String name),而 Person(String name) 有自己的 name,Person(String name) 在栈区,不在堆区,它有自己的名字,就不再使用堆区的名字了。

2 this的作用1:区分参数变量和实例变量

this 代表 所在函数 所属对象的 引用

Person p = new Person("aa");
p.speak();

再次分析 new Person("aa"); 上次分析见 Java基础 --- 构造函数
首先进行两次初始化,默认初始化和构造函数初始化。
在构造函数进行初始化的时候,由于一个类可能会产生很多对象,要给谁进行初始化,在 Java 中,用 this 来表示。
this持有对象的引用 ,谁调用 this,this 就指向谁,初始化完成,该构造函数弹栈,把地址赋给 p.speak() 中的 p。
p.speak(); speak(); 进栈,进栈后,用来说出某个对象的姓名和年龄,哪个对象,不知道。

其实,speak() 进内存的时候,也有一个 this,this 引用对象的地址,speak()指向 this所引用的对象。
System.out.println(name+":"+age);
其实,这句话,应该是:
System.out.println(this.name+":"+this.age);

**注:一个类中的成员,除了静态的,如果想运行,都必须由对象调用,随便定义一个方法 method(); **
其实是 this.method(); ,只是省略了 this

3 this的作用2:在构造函数中调用其他构造函数

构造函数的区分,是通过 参数列表 来完成的。
this 可以用于 在构造函数中 调用其他构造函数。
**注:只能定义在 构造函数的第一行,因为 初始化动作要先执行 **

说明:见代码

 Person(String name)    
    {
        this.name = name;
    }
    Person(String name,int age)
    {
        this.name = name;  // 在上面写了 this.name = name;下面接着写,有点重复了,怎么办? 直接写 this(name);
        this.age = age;     
    }

    Person()
    {       
        name = "baby";
        age = 1;
        System.out.println("person run");
    }   
    Person(String name) 
    {
        this(); --- 能不能用 this 调用上面的构造函数,可以。直接 this()就可以了,因为上面的构造函数,是无参构造函数
        this.name = name;
    }

4 应用

// 判断是否是同龄人

写函数之前的思考:
比较的是年龄,按理说传的参数应该是 age,但是 Java 是面向对象的语言,我们应该用 面向对象的思想 来思考,
所以,传入的 应该是 Person,Person里封装了 age.
public boolean compare(Person p ){
   /*
   调用这个方法的对象,和 传入这个方法的对象,两个对象相比,
   传入这个方法的对象是 p, 所以可以用 p.age 来表示,调用这个方法的对象,用 this.age 来表示
   */
   
    /*
    if(this.age == p.age)
        return true;
    else
        return false;
    */
    return this.age == p.age;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,860评论 2 9
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,489评论 1 24
  •    腾讯老司机果然是老司机啊! 显示隐藏文件    在macOS Sierra系统之前的mac操作系统,想要显示...
    择势量投阅读 68,778评论 3 5
  • 砸出的每一个字 落在地上 都是一个坑 带着毒 刚好容下一具尸体 它活着我便活 它死去我亦死 所剩无几 留恋显得势单...
    兰若雪阅读 168评论 0 0
  • copy和mutablecopy 源于对数据的复制需求,对于对象类型的数据来说,区别于直接持有这个数据对象的方式,...
    纵横而乐阅读 422评论 0 1