一、首先介绍一下this关键字的用法:
总的来说this共有三类用法:
1.this调用本类属性
2.this调用本类方法
3.this表示当前对象
下面通过栗子来具体的解释每种用法:
1.this调用本类属性
注意:一个文件只能有一个公有的类,并且文件名应该和公有的类名一致;如果定义一个类没有用public修饰那么它就是私有类。
class KeyWord{//私有类
private String name;
private int age;
public Person(String name,int age){
name=name;
age=age;
}
public String getPersonInfo(){
return "姓名"+name+",年龄"+age;
}
}
public class Test{//公有类
public static void main(String[] args){
Person per = new Person("张三",20);
System.out.println(per.getPersonInfo());
}
}
通过上面代码的运行结果我们可以看到,当参数和属性名相同的时候,类中的属赋值性无法被正确的赋值。因为它不知道这个属性到底是谁的属性,所以我们需要加上this关键字,当创建对象的时候就会表示当前给当前对象属性赋值。
public Person(String name,int age){
this.name=name;
this.age=age;
}
赋值以后的结果:
注意:只要在访问类中的属性就一定要加上this关键字。
2.this调用本类方法
(1)调用普通方法:this.方法名称(参数)
(2)调用构造方法:this(参数)
(1)this调用普通方法
栗子:
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
this.print();//调用本类普通方法(原则上这可以不用加this)
}
public String getpersonInfo(){
return "姓名"+name+",年龄"+age;
}
public void print(){
System.out.println("****************");
}
}
public class Test1{
public static void main(String[] args){
Person per=new Person("张三",20);
System.out.println(per.getpersonInfo());
}
}
注意:虽然在调用本类普通方法时可以不用加this,但是建议还是加上免得混淆。
(2)this调用构造方法
观察构造方法存在的问题:
class Person{
private String name;
private int age;
public Person(){
System.out.println("****产生一个新对象*****");
}
public Person(String name){
System.out.println("****产生一个新对象*****");
this.name=name;
}
public Person(String name,int age){
System.out.println("*****产生一个新对象*****");
this.name=name;
this.age=age;
}
public String getPersonInfo(){
return "姓名"+name+",年龄"+age;
}
}
public class Test1{
public static void main(String[] args){
Person per1=new Person();
Person per2=new Person("张三");
Person per3=new Person("张三",20);
System.out.println(per1.getPersonInfo());
System.out.println(per2.getPersonInfo());
System.out.println(per3.getPersonInfo());
}
}
对于以上的代码中构造方法的问题出现在,构造方法重载的时候我们写了大量重复的代码;那么为了减少这样的操作,我们必须可以通过调用this方法。在java中,支持this方法的相互调用。
将上面的程序段通过 相互调用this修改为:
class Person{
private String name;
private int age;
public Person(){
System.out.println("****产生一个新对象*****");
}
public Person(String name){
System.out.println("****产生一个新对象*****");
this();//调用本类无参构造函数
this.name=name;
}
public Person(String name,int age){
System.out.println("*****产生一个新对象*****");
this(name);//调用本类中有一个参数的构造函数
this.age=age;
}
public String getPersonInfo(){
return "姓名"+name+",年龄"+age;
}
}
public class Test1{
public static void main(String[] args){
Person per1=new Person();
Person per2=new Person("张三");
Person per3=new Person("张三",20);
System.out.println(per1.getPersonInfo());
System.out.println(per2.getPersonInfo());
System.out.println(per3.getPersonInfo());
}
}
运行的结果和上面是一样的。但是需要注意的是:我们在构造方法中使用this调用的时候,this语句一定是放在第一句的,否则就不能起作用。
3.使用this表示当前对象
class Person{
public void print(){
System.out.println("[print]方法:"+this);//这个this表示谁待用它,就是哪个对象
}
}
public class Test1{
public static void main(String[] args){
Person p1= new Person();
System.out.println("[main]方法"+p1);//后面连接的是对象p1
p1.print();//p1调用print()方法
System.out.println("=========");
Person p2 = new Person();
System.out.println("[main]方法"+p2);
p2.print();
}
}
运行结果:
通过这段代码以及它的运行结果我们可以看到,只要对象调用了本类中的方法,那么这个this就表示当前执行的对象。上面的p1、p2分别调用,这个this分别表示p1、p2两个对象,所以输出的main和print方法后面的都是用一个编码,表示同一个对象。