this关键字
this这个字可以说是学java里面的一个难点了,刚开始的时候确实有些晕,之所以会这样是因为this的使用形式很灵活,不同的情景中代表的含义不一样,但甭管怎样,秉持“不服就干”的态度,盘它!
1、this是个交际花
this这个关键字和类的属性,方法及对象都有关系,this有以下三种调用结构描述:
- 当前类中的属性:this.属性
- 当前类中的方法(普通方法、构造方法):this.方法名(); this();
- 当前对象: this
2、表示当前类中的属性:this.属性
在Java中 “{ }” 是结构体边界,当构造方法的参数名与类的属性名相同时,按照就近原则,构造方法只会匹配 “{ }”内的参数名:
public class WeTest {
public static void main(String[] args) {
Ball ball = new Ball("haha", 111.0);
ball.print();
}
}
class Ball{
private String name;
private double size;
public Ball(String name, double size){
name = name;
size = size;
}
public void print(){
System.out.println("name: " + name);
System.out.println("size: " + size);
}
}
结果:
name: null
size: 0.0
以上代码明明在构造方法初始化了对象的两个属性,但为啥都是空的?原因就是类的属性名称和构造方法的参数名称相同了,本来是给类的属性赋值的,但因为结构体边界 “{ }”,构造方法只会匹配最近的name和size,此时的name和size是构造方法自己的,并不是类的属性,以上的构造方法调用只是构造方法把传来的参数再赋值给自己的参数,自己逗自己玩呢。
要想给类的属性赋值,就必须采用this.属性名区分同名变量:
public class WeTest {
public static void main(String[] args) {
Ball ball = new Ball("haha", 111.0);
ball.print();
}
}
class Ball{
private String name;
private double size;
public Ball(String name, double size){
this.name = name;
this.size = size;
}
public void print(){
System.out.println("name: " + name);
System.out.println("size: " + size);
}
}
结果:
name: haha
size: 111.0
此时,已正确初始化对象的属性值。
3、当前类中的方法(普通/构造方法):this.方法名(); this();
public class Person{
public String name;
public int age;
public Person(){
this("你大爷", 83);
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void personInfo(){
System.out.println("名字是" + name + ",已经活了" + age + "年");
}
public static void main(String[] args) {
Person person = new Person();
person .personInfo();
}
}
this("你大爷", 83); 即调用当前类中的构造方法。
但是需要注意的是:
- 在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
是为了避免操作对象时对象还未构建成功,需要this()和super()的调用在第一行实现【以此来创建对象】,防止异常。
- 不能在构造方法以外的任何方法内调用this这种形式的构造方法。
- 在一个构造方法内只能调用一个this()形式的构造方法。
4、当前对象(作为参数传递)
public class Demo{
public static void main(String[] args){
B b = new B(new A());
}
}
class A{
public A(){
new B(this).print();
}
public void print(){
System.out.println("Hello from A!");
}
}
class B{
A a;
public B(A a){
this.a = a;
}
public void print() {
a.print();
System.out.println("Hello from B!");
}
}
5、总结
总的来说,this主要用来区分同名变量、作为方法名初始化对象、作为参数传递,只要是访问本类中的属性时,一定要用 this.属性 来访问。