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类的构造方法中参数直接改成name和age ,但是根据变量的作用域原则出现了一个问题,构造器的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