this关键字调用属性和方法
文章内容选自尚硅谷
this调用属性和方法
- this可以理解为当前对象的意思
- this可以用来调用属性,意思为当前对象的属性
java的命名原则有一条为见名知意,在方法中,如果出现了类的属性变量和类内方法形参同名的情况,一般遵循的是就近原则
package com.atguigu.java2;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(1);
System.out.println(p1.getAge());
}
}
class Person{
private String name;
private int age;
public void setName(String n){
name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
age = age;
}
public int getAge(){
return age;
}
}
运行结果为
0
public void setName(String n){
name = name;
}
setName方法中的name两个都为形参的name,属性的name的使用范围为类的整个大括号内,方法的name使用范围为方法内部,遇到这种情况一般都是就近原则,即两个name都被视为形参(局部变量),当调用完方法后局部变量就被出栈了,没有给类的属性赋值。
因此,要想声明前一个name为属性变量,加上关键字this即可。
class Person{
private String name;
private int age;
public void setName(String n){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
运行结果为
1
这儿this理解为
当前对象
。this一般都是被省略掉的,比如
public String getName(){
return this.name;
}
也是正确的,只不过通常情况下不用this关键字,只是发生以上的重名情况要用this来进行区分。
this.方法
this.方法一般都省略掉
比如在
public void eat(){
System.out.println("人吃饭");
this.study();
}
public void study(){
System.out.println("人学习");
}
Person类中加入了以下两个方法,this.study()有没有这个this都无所谓。
this调用构造器
- 构造器有时也称构造方法,在构造器内部给属性赋值的时候,也可以使用this.属性,来区别于形参。
-
this调用构造器的用法为
this(形参列表)
,形参列表必须是另一个构造器的形参列表,这样就可以在本构造器内调用另一个构造器的全部方法。
public Person(){
eat();
//person初始化时,假设以下还需40行代码
}
public Person(String name){
this.name = name;
//person初始化时,假设以下还需40行代码
}
public Person(int age){
this.age = age;
//person初始化时,假设以下还需40行代码
}
public Person(String name,int age){
this.name = name;
this.age = age;
//person初始化时,假设以下还需40行代码
}
在原来的类中加入构造器,以上的4个构造器构成了构造器的重载,假如每个构造器的初始化都要有40多行重复的代码,就会造成代码的冗余。因此采用this的构造器调用。
package com.atguigu.java2;
public class PersonTest {
public static void main(String[] args) {
// Person p1 = new Person();
// p1.setAge(1);
// System.out.println(p1.getAge());
Person p2 = new Person("xiaoihuang",18);
System.out.println("name="+p2.getName()+",age="+p2.getAge());
}
}
class Person{
private String name;
private int age;
public Person(){
eat();
String info = "person初始化时,假设以下还需40行代码";
System.out.println(info);
}
public Person(String name){
this();
this.name = name;
}
public Person(int age){
this();
this.age = age;
}
public Person(String name,int age){
this(age);
this.name = name;
// this.age = age;
setName(name);
}
public void setName(String n){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void eat(){
System.out.println("人吃饭");
this.study();
}
public void study(){
System.out.println("人学习");
}
}
运行结果为
人吃饭
人学习
person初始化时,假设以下还需40行代码
name=xiaoihuang,age=18
代码分析
分析代码,在main方法中调用的构造器是
public Person(String name,int age){
this(age);
this.name = name;
// this.age = age;
setName(name);
}
这个构造器,该构造器调用了前一个构造器
public Person(int age){
this();
this.age = age;
}
这一步已经给age的属性赋值了,但是在这个构造器中还调用了前一个构造器
public Person(){
eat();
String info = "person初始化时,假设以下还需40行代码";
System.out.println(info);
}
因此输出了
人吃饭
人学习
person初始化时,假设以下还需40行代码
此时还没有给name赋值,采用setName(name);方法在public Person(String name,int age)构造器内赋值,这就是全部的执行过程。
采用调用构造器的方法,可以不断利用上一个构造器的内容,因此避免了代码的冗余,增强了可读性。在this调用构造器的时候,有几点注意事项
- this(形参列表);语句只能够至于方法体的首行。
- 一个构造器只能使用一次this(形参列表);不能调用多个构造器,调用多个构造器,总有this语句不在首行的情况。
- this调用构造器时不能自己调用自己,也不能相互调用
- this调用构造器时不能形成闭环,比如说有A,B,C,D四个构造器形成构造器的重载,A调用B,B不能调用A,B只能调用C或者D,假如B调用C,则C不能调用B,也不能调用A,因为一旦调用了A或者B,就构成了闭环,C只能调用D,D谁也不能调用。因此,假如说有n个构造器重载,最多调用n-1次。