1.java中 this可以完成三件事:表示本类属性、表示本类方法和当前对象.
1.1 "this.属性"表示本类属性
本程序通过构造方法传递两个初始化参数,而后调用了getlnfo()方法返回类的信息.
这时构造方法的两个参数的目的是为类中的name和age两个初始化,可是这个方法中的两个参数一个是字母n,另一个是字母a,这表示的完全不明确,既然构造方法的两个参数是为name和age属性初始化使用的,那么就将名称定义为name和age才最合适.
public Person(String n,int a){
name=n;
age=a;
}
运行结果
1.2修改构造方法
运行结果
此时的构造方法上的两个参数的名称变得有意义了,但是属性却没有内容了,因为在程序中是以"{}"作为一个分界,采用就近的取用原则.
所以为了可以明确指定要操作的是类中属性,采用"this.属性"的形式完成.
修改代码
运行结果
使用“this.属性”格式后,可以将正确的数值赋值给指定的属性.
只要是调用类中属性的情况,都要使用"this.属性"的方式进行表达.
2.调用本类方法
在一个类中,现在主要就是两种方法(普通方法、构造方法),而要调用本类方法也 就分为两种形式.
1.调用本类普通方法:如果现在要调用的是本类方法,则可以使用"this.方法()“调用.
2调用本类构造方法:在一个构造中要调用其他构造使用"this()调用”.
2.1 现在存在三个构造函数(无、一个、二个参数),但是不管使用哪个构造方法,都要求在实例化对象产生的时候输出一行提示信息"一个新的类对象被实例化(加上为50行代码)".
运行结果
不管哪各构造方法,都可以完成指定信息输出,如果为50行的代码的量,会出现重复代码,为了减少重复代码,可以利用this()来完成.
代码如下
有两个参数构造方法(public Pers2(String name,int age))里,使用"this(name)"调用了一个有参数的构造方法( public Pers2(String name)),而一个参数的构造方法又使用了"this()"调用了无参构造方法,从而实现了构造方法互相调用.
运行结果
2.2 在使用this调用构造方法时要注意
所有的构造方法是在对象实例化时被默认调用的,而且是在调用普通方法之前调用,所以使用"this()"调用构造方法的操作一定要放在构造方法的首行.
所以使用‘’this()‘’要放在构造方法首行,放在构造方法之中.
如果类中存在多个构造方法,构造方法都使用了this()互相调用,那么至少要保留一个构造方法没有调用其他构造,作为程序的出口.
2.3 this可以解决代码重复问题
通过this语法,很好解决了构造方法中代码重复问题.构造方法相互调用的操作是在对象实例化时,不同的构造方法在一些相同操作的情况下会使用.
package lesson12;
class Emp{
private int empno;
private String ename;
private double salary;
private String dept;
public Emp(){
}
public Emp(int empno){ //调用四个参数的构造
this.empno=empno;
this.ename="无名氏";
this.salary=0.0;
this.dept="未定";
// this(empno,"无名氏",0.0,"未定");
}
public Emp(int empno,String ename){
this.empno=empno;
this.ename=ename;
this.salary=1000.0;
this.dept="后勤";
// this(empno,ename,1000.0,"后勤");
}
public Emp(int empno,String ename,double salary,String dept){
this.empno=empno;
this.ename=ename;
this.salary=salary;
this.dept=dept;
}
public String getlnfo(){
return "雇员编号:"+this.empno+",姓名:"+this.ename+",工资:"+this.salary+",部门:"+this.dept;
}
}
public class TestDeo3 {
public static void main(String[] args) {
Emp emp=new Emp(1);
System.out.println(emp.getlnfo());
}
}
package lesson12;
class Emp{
private int empno;
private String ename;
private double salary;
private String dept;
public Emp(){
}
public Emp(int empno){ //调用四个参数的构造
this(empno,"无名氏",0.0,"未定");
}
public Emp(int empno,String ename){
this(empno,ename,1000.0,"后勤");
}
public Emp(int empno,String ename,double salary,String dept){
this.empno=empno;
this.ename=ename;
this.salary=salary;
this.dept=dept;
}
public String getlnfo(){
return "雇员编号:"+this.empno+",姓名:"+this.ename+",工资:"+this.salary+",部门:"+this.dept;
}
}
public class TestDeo3 {
public static void main(String[] args) {
Emp emp=new Emp(1);
System.out.println(emp.getlnfo());
}
}
3.this表示当前对象
当前对象指的是当前正在调用本类方法的操作对象.
package lesson12;
class Demo{
void print(){
System.out.println("当前对象:"+this); //直接输出this
}
}
public class TestDeo4 {
public static void main(String[] args) {
Demo demo1=new Demo();
Demo demo2=new Demo();
System.out.println(demo1); //直接输出对象
demo1.print(); //调用方法,即:输出this
System.out.println("======");
System.out.println(demo2); //直接输入对象
demo2.print(); //调用方法,即:输出this
}
}
运行结果
对象直接输出所返回的是一个对象的编码,当前正在调用类中方法的对象为当前对象,而所有的当前对象都使用this来表示(之前的"this.属性"就表示当前对象的属性).