今天学习的内容是this关键字
类的实例变量和非静态方法必须由对象调用,那么在非静态方法(包括构造函数也一样)中调用本类的实例变量和非静态方法时怎么弄呢?这就用到了this,它表示本类对象的引用,this关键字的知识点:
- this只能在方法体中使用,表示对“调用方法的那个对象”的引用
- 实际上,非静态方法(包括构造函数)中有一个隐含的this变量,调用这些方法就相当于给this进行了一次赋值
- 在方法内部调用本类的实例变量或非静态方法,直接调用即可,实际上这是由于编译器帮着自动添加了this关键字
- this不能用于静态方法内部(所以实例变量和非静态方法也不能直接在静态方法内部调用),这是由于调用静态方法压根不用创建该类对象,所以根本没有“调用方法的那个对象”!!静态方法中根本不存在隐含的this变量!!
- this常用于在构造函数中(形参名和实例变量名相同的场景)标明实例变量,格式:this.实例变量
- this还常用于在构造函数中调用本类的另一个构造函数,格式:this(参数)
- this()必须在构造函数的第一行使用且只能调用一次
- 每个构造函数可以选择调用this()或super(),但不能同时调用
示例程序:
public class Test26 {
private String name;
private Date date;
public Test26(){
System.out.println("无参构造函数");
}
public Test26(String name){
this();//this()必须在构造函数的第一行使用且只能调用一次,调用无参构造函数
//!super(); super()和this()不能同时调用
this.name=name;//形参名和实例变量名相同的场景,this用来标明实例变量
System.out.println("参数为String的构造函数,参数为"+this.name);
}
public Test26(Date date){
this("k");//调用参数为String的构造函数
this.date=date;//形参名和实例变量名相同的场景,this用来标明实例变量
System.out.println("参数为Date的构造函数,参数为"+date);
}
public static void main(String[] args){
//!System.out.println(this); 静态方法不能使用this
//!System.out.println(name); 静态方法中不能直接调用非静态变量
//!System.out.println(date); 静态方法中不能直接调用非静态变量
//!bb(); 静态方法中不能直接调用非静态方法
Test26 t=new Test26(new Date());
System.out.println(t.name);
System.out.println(t.date);
t.bb();
}
public void aa(){
System.out.println("aa()方法");
}
public void bb(){
System.out.println("name="+name);//实际上编译器自动添加this关键字,this.name
System.out.println("date="+date);//实际上编译器自动添加this关键字,this.date
aa();//实际上编译器自动添加this关键字,this.aa()
}
}