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());//得到轮子数
    }
posted @ 2022-10-17 10:43  Liku007  阅读(18)  评论(0编辑  收藏  举报