this关键字:
关于this关键字:
* 1、this:这个。
* 2、this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。
* 3、创建100个对象,每一个对象都有this,即有100个不同的this。
* 4、this可以出现在”实例方法“中,this指向当前正在执行这个动作的对象。
* 5、多数情况下,this也可以省略不写。
* 6、this不能使用在带有static的方法当中。
一、this只能用在实例方法中访问实例变量
以下是this在用户类中的使用举例:
public class Customer {
String name; //实例变量
public void thisGet(){
System.out.println(this.name); //name也是一个实例变量,
}
/*不带有static关键字的一个方法:
* 顾客购物的行为:由于每一个顾客购物最终的结果是不一样的,所以购物这个行为属于对象级别的行为。
* 由于每一个对象在执行购物这个动作的时候最终结果不同,所以购物这个动作必须有”对象“的参与。
* 重点:没有static关键字的方法称为”实例方法“;实例方法访问方式:”引用.“。
* 重点:没有static关键字的变量称为”实例变量“。*/
public void shopping(){
//这里name的访问完整的方式应该是”引用.变量名;“,不过这里因为创建的对象是发生变化的。
//因此这里可以用this.name进行调用。
System.out.println(this.name+"正在超市挑挑选选。");
}
/*在带有static修饰符的方法中不能使用this,this只能在动态对象中访问使用,
由此this不能访问,直接访问name(实例变量)也不行。
带有static修饰符的方法这个执行过程中没有”当前对象“,带有static的方法是通过”类名.“的方式访问的;
且该”上下文“当中没有”当前对象“,不存在this(指向当前对象)需要。*/
public static void getVue(){
//创建对象
Customer c = new Customer();
System.out.println(c.name); //因为又新创建了对象,这里name变量存储的是初始化的值null。
}
}
用户测试类中:
public class CustomerTest {
public static void main(String[] args) {
Customer cus = new Customer();
cus.name = "gege";
Customer cus1 = new Customer();
cus1.name = "meimei";
//根据创建的cus1中存储的Customer对象进行调用
System.out.println("调用客户类中的实例变量为:"+cus1.name);
//调用实例方法为"引用."
int c = cus1.sum(5,6);
System.out.println("调用客户类中的实例方法结果为:"+c);
//定义实例方法的原因:每个不同的顾客对象调用的最终的结果不同。即这个动作完成的时候必须有对象的参与。
cus.shopping(); //gege正在超市挑挑选选。
cus1.shopping(); //meimei正在超市挑挑选选。
//调用自己类中不含有static的方法,先创建对象
CustomerTest cut = new CustomerTest();
double result = cut.sumDouble(11.3, 12.2);
System.out.println("调用本类中的不含有static修饰符的实例方法结果则为:"+result);
//调用含有static的方法”类名.方法名();“,如果在本类中则类名还可以省略
print();
Customer.pay();
//类名.方法名去获取static方法
Customer.getVue();
}
二、this不能省略的情况
在局部变量中出现和实例变量重名的变量则需要在实例变量前添加this。
/*
* this不能省去的情况:this.用来区分局部变量和实例变量的时候不能省略。
* */
public class ThisTest03 {
private int id; //实例变量
private String name;
private double price;
//设置set()和get()
public void set(int a){
id = a; //对id进行修改
}
public void setId(int id) { //int a是可以的,但为了见名知意,将a修改为id
//id = id;
//java的就近原则,这里id已经跟上述id没有任何关系,仅在该setId方法中作用,将自己赋值给自己,带来问题。
this.id = id; //解决:将省去的this添加进来解决命名冲突问题。
}
}
三、this构造器转发
下面是自定义日期类:
/*自定义的日期类型
* */
public class Date {
private int year;
private int month;
private int day;
//构造方法
public Date(int year, int month, int day){ //有参数构造器
this.year = year;
this.month = month;
this.day = day;
}
public Date(){ //无参数构造器
//this.year = 2004;
//this.month = 4
//this.day = 14;
/*这里引出问题:
由于无参数调用,需要在无参数构造器内部填写对应有参数构造器一一对应的数据,繁复。
如果有100个值,就要进行100个参数填写。
能不能在这里直接进行对有参数列表的调用呢?(有参数列表可以自动生成)*/
//new Date();//虽然可以创建对象,但显然不符合程序设计原则,在DateTest已经进行了对象的创建,这里再一层创建对象不合理,达不到简便的而作用。
//这时候就可以利用this进行直接调用当前对象,不需要再创建对象。调用方法为this();
this(2004,4,14); //Call to 'this()' must be first statement in constructor body
/*对了,构造方法使用this的要求:必须是构造器内的第一条java语句,否则出现上述报错。*/
System.out.println("this();语句使用必须是构造器内第一条语句,本输出为第二条语句。");
}
//打印方法
public void print(){
System.out.println(this.year+"年-"+this.month+"月-"+this.day+"日。");
}
}
日期测试类:
/*
this可以用在哪里:
1、可以用在实例方法当中,代表当前对象【语法格式:this.】
2、可以使用在构造方法中,通过当前的构造方法调用其他的构造方法【语法格式:this(实参);】
重点记忆:this()这种语法只能出现在构造函数第一行。
* */
public class DateTest {
public static void main(String[] args) {
//需求:调用无参数构造器的时候打印出日期:2004年4月14日。
Date d1 = new Date();
d1.print();
Date d2 = new Date(2021, 5,21); //调用有参数构造器,可以将参数传入参数列表
d2.print();
}
}