Java this关键字你真的理解吗?

导读:本篇文章讲解 Java this关键字你真的理解吗?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Java this关键字详解

this关键字

this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。比如:成员变量与方法内部的变量重名时,希望在方法内部调用成员变量,怎么办呢?这时候只能使用this来解决。

this关键字引入

我们看这样一个案例

class Person {
    private String name;
    private int age;

    public Person(String n, int a) {
        name = n;
        age = a;
    }
}

在这个Person类的构造方法中,我们通过构造方法的参数来给属性赋初值,这样写肯定是没有问题的,但是如果我们的构造方法,能够直接写成属性名就更好了,比如在Person类的构造方法中参数直接改成nameage ,但是根据变量的作用域原则出现了一个问题,构造器的name和age是局部变量,而不是属性,这时候就需要引入this关键字啦!!!我们需要在构造器中用this关键字来指明属性,这是当前对象的name,这是当前对象的age。 如下:

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

其实如果我们的局部变量没有与属性冲突时,在底层给我们已经隐藏了当前的this,比如在上述示例中 name = n; 在编译器底层就是 this.name = n;但是局部变量与属性冲突了就必须要使用this关键字了,否则属性值并不会改变。 this 关键字表示当前对象本身,举个栗子🌰,我们用上述构造器实例化两个对象,每个对象都有属于自己的名字年龄,this关键字就起到了这个作用,指向自己的属性(名字年龄)。

为了更直观一些,当构造方法中局部变量与属性冲突时,我们在用this关键字和没用this关键字两种情况下,实例化对象来观察结果。

①没用this关键字

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        name = name;
        age = age;
    }

    public void info() {
        System.out.println("姓名:" + name + " 年龄:" + age);
    }
}

public class TestDemo01 {
    public static void main(String[] args) {
        Person person = new Person("吕布", 17);
        person.info();
    }
}

运行结果:
在这里插入图片描述

②使用this关键字

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void info() {
        System.out.println("姓名:" + name + " 年龄:" + age);
    }
}

public class TestDemo01 {
    public static void main(String[] args) {
        Person person = new Person("吕布", 17);
        person.info();
    }
}

运行结果:
在这里插入图片描述
结论:
中没有使用this关键字,即没有指向当前对象的属性,属性并没有被改变,属性仍为默认值;相反在 使用了this关键字,指向了当前对象的属性,属性被改变。


验证:
接下来我们通过打印对象的地址来验证this关键字表示的是当前对象本身,因为Java的所有的程序都是在Java虚拟机上跑的,我们无法拿到对象的地址,不过可以通过调用HashCode()的方法来拿到对象的哈希码值,值得注意的是,哈希码值并不是对象的真正地址,不过我们可以简单的把它当成对象的地址。
我们在主函数中用对象调用hashCode()方法和在构造方法中用this关键字调用hashCode()方法,观察两个地址是否相同。

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println(this.hashCode());
    }

}

public class TestDemo01 {
    public static void main(String[] args) {
        Person person = new Person("吕布", 17);
        System.out.println(person.hashCode());
    }
}

运行结果:
在这里插入图片描述
通过结果发现,两者的哈希码值相同,所以验证了this关键字指向了对象的本身。

this 关键字使用细节

1.this关键字可以用来访问本类的属性、方法、构造器
2.this关键字用来区分当前类的属性和局部变量
3.访问成员方法的语法:this.方法名(参数列表)

class A {
    public void fun1() {
        System.out.println("fun1方法被调用");
    }
    public void fun2() {
        this.fun1();
        System.out.println("fun2方法被调用");
    }
}
public class TestDemo02 {
    public static void main(String[] args) {
        A a = new A();
        a.fun2();
    }
}

运行结果:
在这里插入图片描述
通过结果发现,fun2方法中成功调用fun1方法,这时候可能会有人问了,我没有通过this关键字也成功调用了fun1方法,因为代码底层给你隐含当前的this关键字
4.访问构造器语法:this(参数列表);
注意 this(参数列表) 只能在构造器中使用且放在构造器中的第一行

class A {
    A() {

    }

    A(int a) {
        this();
    }

}

在A类中有参构造函数调用了无参构造函数。

5.this不能在类定义的外部使用,只能在类定义的方法中使用
this关键字肯定要与对象相关联的,所以只能在类定义的方法中使用。

6.this关键字不能用在静态方法中
static方法是类方法,它先于任何的实例对象存在,知道类加载机制的xdm肯定清楚,static修饰的方法在类加载的时候就已经存在了,而对象是在创建的时候才在内存中出现。另一方面static修饰的方法可以直接用类名调用,当使用的是类调用而不是对象的话,this就无法指向哪个对象了,所以this关键字不能用在静态方法中。

小试牛刀

为了加深对this关键字的理解,我们最后来做这样的一个案例:定义一个Person类,里面有name、age属性,并提供compareTo比较方法,用来判断是否和另一个人相等,提供TestPerson测试类 用来测试名字和年龄是否完全一样,如果一样返回 true,否则返回false

代码如下:

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.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 p1 = new Person("吕布",18);
        Person p2 = new Person("王昭君", 17);
        System.out.println(p1.compareTo(p2));
    }
}

运行结果:
在这里插入图片描述
分析compareTo方法:

 public boolean compareTo(Person p) {
        return this.name.equals(p.name) && this.age == p.age;
    }

compareTo方法中this表示当前的对象,即当前对象的name和传进来的对象的name做比较,当前对象的age和传进来的对象的age做比较。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95528.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!