this关键字
上文说介绍了对象的创建,但是在创建构造方法的时候有个小缺陷
class Cat{
//创建属性
String name;
int age;
//创建无参构造方法
public Cat () {}
//创建有参构造方法
public Cat (String n,int a) {
name = n;
age = a;
}
}
这是一个简单的类的创建以及构造方法的实现
这里的问题就是,在有参构造方法中,两个赋值语句,里面的“n”和“a
“分别代表什么意思?当然我们写代码的肯定知道,但是如果别人看我们的代码呢?是不是就满足不了编程语言中的”望名生意“的意思了!这一章说的就是为了解决这个问题的关键————this关键字
在java中,this就是一个关键字。不同的是,this关键字在不同的场景下的用法也是不同的。
首先,将this关键字用在局部变量中会发生什么呢?
package day23;
public class TestThis {
public static void main(String[] args) {
//创建对象,调用方法
Number num = new Number();
num.number();//第一次20,第二次10
}
}
//创建一个类
class Number {
//定义成员变量
int a = 10;
//创建一个方法
public void number() {
//定义局部变量
int a = 20;
System.out.println("此时打印的是局部变量a的值" + a);
System.out.println("此时打印的是成员变量a的值" + this.a);
}
}
看上面代码是不是有点奇怪,同样是a的值,为什么不仅没有报错,而且打印出出来的值还是不一样的?
全部都要归功于this关键字,在this.a这段代码中,this.指的就是调用当前类的属性,在当前的类,也就是成员变量a,有如果没有加this,有句话记住当成员变量和局部变量命名冲突的时候,局部变量优先,所以在不加this 的时候指的是当前的局部变量,第一次结果是打印的局部变量,而第二次加了this关键字,打印的是成员变量,这也就是this关键字在用在普通方法中的大致作用了!
那么如何用在构造方法中呢?
代码案例:
package day23;
public class TestThis_a {
public static void main(String[] args) {
}
}
//创建一个对象
class Cat {
//创建属性
String name;
int age;
//创建无参构造方法
public Cat() {}
//创建有参构造方法
public Cat (String n, int a) {
name = n;
age = a;
}
}
这是原始的正常操作的正常创建对象、创建构造方法的流程
此时的构造方法的参数命名么有满足望名生意的意思,修改如下
package day23;
public class TestThis_a {
public static void main(String[] args) {
}
}
//创建一个对象
class Cat {
//创建属性
String name;
int age;
//创建无参构造方法
public Cat() {}
//创建有参构造方法
public Cat (String name,int age) {
this.name = name;
this.age = age;
}
}
public Cat (String name,int age) {
this.name = name;
this.age = age;
}
看这里,我们用到了this关键字,在构造方法里面的意思就是调用当前类的属性也就是说,此时在构造参数里面的形参,就是一个变量,我们将这个变量赋值给我们当前属性,在创建对象传入实参的时候,如果调用的是有参构造方法那么也就是将用户填入的实参赋值给类的属性。画个图来理解一下
分析这个图片
首先创建对象,可以看出创建对象的时候有实参,那么创建对象的过程中就要用到类中的有参构造方法,第一步:将实参传递给类中的有参构造方法,此时的有参构造方法是有真实值的;
第二步:我们用到了this关键字,此时有参构造方法的语法意思为:将后面的值赋值给前面的值,也就是将构造方法中的形参(此时是在创建对象的过程中了,那么现在形参是有真实值的)将形参赋值给本类中的属性,name和age(为什么是本类中?因为我们用到了this关键字)。此时this关键字就是这个作用调用本类中的属性。
其实this关键字记好一句话就好:
如果局部变量命名和成员变量命名发生冲突,没加this之前是局部变量优先,加了this,那么指的是调用本类中的成员变量