欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java 关键字 --,

来源: javaer 分享于  点击 17060 次 点评:100

Java 关键字 --,


    • 1 this出现的原因
    • 2 this的作用1:区分参数变量和实例变量
    • 3 this的作用2:在构造函数中调用其他构造函数
    • 4 应用

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

相关文章

    暂无相关文章
相关栏目:

用户点评