this的概念:

  this保存当前对象的内存地址,指向自身;

  this保存在堆内存的对象中;

  this用来访问实例变量 ,表示当前对象,所以this不使用于静态方法中,可以省略;

public class ThisTest02{
    public static void main(String[] args){
        Student s1 = new Student();
        s1.setName("wang");
        s1.setNum(2222);
        System.out.println(s1.getNum());
        System.out.println(s1.getName());
        
        Student s2 = new Student(111,"li");
        System.out.println(s2.getNum());
        System.out.println(s2.getName());   
    }
}

class Student{
    private int num;
    private String name;
    
    public Student(){  //无参构造方法
        
    }
    
    /*
    public Student(int nu, String na){       //有参数的构造方法,可行
        num = nu;
        name = na;
    }
    */
    
    public Student(int num, String name){     //上面的构造方法可以写成这种形式,增强可读性
        this.num = num;        //构造方法中this不能省略
        this.name = name;
    }
    //setter and getter方法
    /*
    public void setNum(int nu){      //添加设置num和name的设置方法
        num = nu;
    }
    public void setName(String na){
        name = na;
    }
    */
    
    /*
    public void setName(String name){
        name = name;   //如果此处不加this,此处两个name都为局部变量,和实例变量没有关系;
    }
    public void setNum(int num){
        num = num;
    }
    */
    
    public void setNum(int num){
        this.num = num;      //实例方法中this不能省略
    }
    public void setName(String name){
        this.name = name;
    }
    
    public int getNum(){
        //return this.num;
        return num;    //访问实例变量,通过this访问,this可以省略
    }
    
    public String getName(){
        return this.name;
    }
    
}

结论:

  this不能省略的场景:
  this用在实例方法和构造方法中,用来区分实例变量和局部变量时,不能省略

this的另一种使用场景:

  在构造方法1中通过this(实际参数列表)的语法结构调用构造方法2;

  示例

public class ThisTest03{
    public static void main(String[] args){
        Date d1 = new Date();       //如果调用无参构造函数,可以给一个默认值
        d1.detail();
        
        Date d2 = new Date(2020,12,28);
        d2.detail();
        
        Date d3 = new Date();
        d3.setYear(2020);
        d3.setMonth(12);
        d3.setDay(22);
        System.out.println(d3.getYear());
        System.out.println(d3.getMonth());
        System.out.println(d3.getDay());
    }
}

class Date{
    private int year;
    private int month;
    private int day;
    
    public Date(){
    //    System.out.println(11);    //错误: 对this的调用必须是构造器中的第一个语句,如果通过this实现,则this必须第一
    //    this.year = 1970;
    //    this.month = 1;
    //    this.day = 1;             //如果调用无参构造函数,可以给一个默认值,可以这样实现;
    
        this(1970,1,1);  //在构造方法1中使用this调用构造方法2,做到代码复用;
    }
    
    public Date(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    
    public void detail(){
        System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
    }
    //setter and getter
    public void setYear(int year){
        this.year = year;
    }
    public int getYear(){
        return year;
    }
    
    public void setMonth(int month){
        this.month = month;
    }
    public int getMonth(){
        return month;
    }
    
    public void setDay(int day){
        this.day = day;
    }
    public int getDay(){
        return day;
    }
}

  结论:

  可以在构造方法1中通过this调用构造方法2,做到代码复用,但是这种方式,this语句必须是构造方法中的第一条语句;

posted on 2020-12-27 22:52  homle  阅读(305)  评论(0编辑  收藏  举报