4. this关键字
this关键字代表是对象的引用。也就是this在指向一个对象,所指向的对象就是调用该方法的对象引用。
没有this会怎样?
我们之前写过一个Employee类,封装name和age属性,设置setter方法,当时是这么写的:
class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
但如果我们不加this呢?
注意编译器给的提示:对变量的赋值没有任何作用!也就是你写的这个方法根本就没效果!
为什么是这样呢?我们要从Java虚拟机(jvm)的原理说起:
jvm会认为你拿要传进去的参数name再给参数name,就好比我左手的一支笔传到了右手里,实际上这支笔还在我的身上!
解决的方案:用this关键字来区分是你的还是我的。。。
反映到代码上也就是区分是方法给的参数,还是我自己的变量。
构造方法的重载问题
再想一个问题:
我们写的Employee中,我定义两个构造方法,试图用其中一个构造方法去调用另一个。
发现编译器不允许我们这么做!
可如果这样的话………………试想这样的场景:
如果一个类有100个属性,其中有一个构造方法要用50个,另外一个方法要用51个,而且跟前一个的50个都重叠,
那么想要调用构造方法就成了问题。---不能通过构造方法名进行自身调用!
那么,这个this到底是什么?
——————在构造方法中打印this
public class Test {
public static void main(String[] args) {
Employee employee = new Employee("胖虎", 24);
}
}
class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
System.out.println(this);
}
}
我们发现打印了一串很奇怪的东西,但前面的Employee我认识!这是我自己写的类!
@15db9742是内存地址,这个在之前提栈内存与堆内存里似乎有提,当然,如果能去百度查一下岂不是更妙? ̄へ ̄
——————创建对象,打印对象名p
public class Test {
public static void main(String[] args) {
Employee employee = new Employee("胖虎", 24);
System.out.println(employee); // 打印出这个对象!
}
}
class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
System.out.println(this);
}
}
竟然两者惊人的一致!
这说明了什么问题呢。。。。。。
- this和p是一样的都是内存地址值。
- this代表所在方法所属对象的引用。
使用this关键字的效果:
我们修改Employee类,让其中空参构造方法中调用双参的构造方法:
class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public Employee() {
this("胖虎", 24);
}
}
其余需要注意的:
1:this只能在非静态中(没有static修饰的)方法使用
2:构造方法间相互调用必须放在构造方法的第一个语句中,否则编译错误
3:可以解决构造方法中对象属性和方法形参的同名问题。
呃,这一节就不增强手机了,因为setter方法已经有了(滑稽脸)