this关键字
this关键字
是指当前正在运行的对象,它是位于栈内存
this可以访问类的成员变量/方法
利用this访问成员变量
public class Book {
private int id;
public int getId() {
return this.id;//这里的this是我自己加的,加不加是一样的,这里返回值默认是this.id
}
public void setId(int id) {
System.out.println("this"+this);
this.id = id;//这里的this指当前运行的对象book和book1,可用于调用属性和方法
}
}
public static void main(String[] args) {
Book book=new Book();//创建了一个book对象
System.out.println("book"+book);//输出book内容
book.setId(1);//调用setId方法,这里面有this
Book book1=new Book();//创建了一个book1对象
System.out.println("book1"+book1);
book1.setId(1);//调用的是同一个方法,this是相同的
}
两个对象调用的是同一个方法里面的this,但是this的结果是不一样的,输出结果是:
bookcom.Likujava.Book@1540e19d
thiscom.Likujava.Book@1540e19d
book1com.Likujava.Book@677327b6
thiscom.Likujava.Book@677327b6
可见this是在变化的,在每次new了一个对象之后,this是不同的,当book对象在运行的时候,this跟book是同一个哈西code,但是book1 运行的时候,this又与book1是一样的,this是指当前运行的对象
this访问当前类的构造方法
public Book() {//无参构造方法
//this(给有参构造里面的this数据赋值,这里有参构造里面只有一个this.id只需要赋值);
this(1001);
}
public Book(int id) {//有参构造方法
this.id = id;
}
this充当实际参数和返回的数据
习题:创建一个车类和修车厂类,判断轮子数是否等于四,如果小于4拿去修车厂修,并且将修车厂修好的车轮子数改为4
车类:
@Setter//lombok注解里面的set方法,他包含类里面所有属性的set方法,放这里作用域是source
@Getter//lombok注解里面的get方法,跟setter注释一样的
@NoArgsConstructor//lombok里面的无参构造方法
@AllArgsConstructor//lombok里面的有参构造方法,这里参数包含类里面的所有属性
public class Car {
private String Brand;
private int wheelNum;
public void run(){
if(wheelNum<4){
FixCarfactory fixcar=new FixCarfactory();
fixcar.fixcar(this);
//这里面的this指的是调用该方法的对象,下面创建了car1对象,并且car1调用了该方法
//因此这里可以直接用this代替car1
}
System.out.println(Brand+"正在跑");
}
}
修车厂类:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FixCarfactory {
private String name;
public void fixcar(@NonNull Car car){//还得判断一下是否为空,为空的话会出现NPE异常,直接加上lombok里面的注解@NonNull,放在这作用域是class
System.out.println(name+"正在修"+car.getBrand()+"车");
//这里name指的是this.name,也就是FixCarfactory里面的name,我没有给赋值,为null
car.setWheelNum(4);
}
}
运行类(测试修车类):
public class Cartest {
public static void main(String[] args) {
Car car1 = new Car("BMW",3);
//创建car1对象并且初始化类属性的值
car1.run();
System.out.println(car1.getWheelNum());//得到轮子数
}