【开开心心学java,快快乐乐写代码】this引用

在上篇博客中为大家讲解了什么是类、什么是对象以及如何实例化一个类。那么从这篇博客开始就要深入类与对象啦。这篇博客主要会讲解一下this这个关键字以及它的用法,文章不长,依旧还是写的很详细哦,快来看看吧~

目录

1、this引用

1.1为什么要有this引用

1.2什么是this引用

1.3this引用的特性

2、this引用的三种方法

2.1 使用this引用来访问成员变量

2.2 使用this引用调用构造方法

2.3使用this引用调用成员方法


1、this引用

1.1为什么要有this引用

先来看一个日期类例子:

class Data{

    //属性
    public int year;
    public int month;
    public int day;

    //方法
    public  void setData(int y,int m,int d){
        year=y;
        month=m;
        day=d;
    }

    public void printData(){
        System.out.println(year+","+month+","+day);
    }

}
public class Test {
    public static void main(String[] args) {
        Data data1=new Data();
        Data data2=new Data();
        Data data3=new Data();
        data1.setData(2000,12,15);
        data2.setData(2001,11,05);
        data3.setData(2020,22,35);
        data1.printData();
        data2.printData();
        data3.printData();
    }

}

运行结果: 

 以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,输出也是我们需要的结果。

但是仔细一想,如果我们将形参的变量名改的和成员变量名一样了呢?

比如我们将Date类中的setDate()方法不小心写成了这个样子呢:

 public  void setData(int year,int month,int day){
       year=year;
       month=month;
       day=day;
 }

再来看一下输出结果:

这个输出结果就不是我们所需要的了。 可是为什么会这样呢?

我们可以发现,就拿year这个变量来说,存在成员变量year和方法setDate()中的参数year,成员变量中变量year的作用域是整个类,而方法setDate()中的参数year的作用域就只是在方法setDate()内部,因此可以发现两个year的作用范围有了冲突

Java语言规定当作用范围小的变量与作用范围大的变量有重叠部分时,作用域小的变量会覆盖作用域大的变量。但是这种情况往往是我们不想要的,我们不希望谁去覆盖谁,为了解决这种问题,就要用到this这个关键字。这种情况下需要访问成员变量a则必须使用this进行引用.当然,如果变量名不发生重叠,则this可以省略。但是为了增强代码的可读性,一般将参数的名称和成员变量的名称保持一致,所以this的使用频率在规范的代码内部应该很多。

1.2什么是this引用

java编译器给每一个成员方法都增加了一个隐藏的引用类型参数,该引用参数指向了当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有对成员变量的操作,都是通过该引用去访问。只不过该引用对用户来说是透明的,用户不需要进行传递,编译器会自己加上。

1.3this引用的特性


(1) this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
(2)this只能在"成员方法"中使用。
(3)在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性。
(4) this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。

下图中的Date类也是可以通过编译的

2、this引用的三种方法

2.1 使用this引用来访问成员变量

class Data{

    public int year;
    public int month;
    public int day;

    public  void setData(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }

}

2.2 使用this引用调用构造方法

class Ts{
    public Ts(){

    //调用含两个参数的构造方法
        this(10,20);
    }
    public Ts(int a,int b){
        System.out.println("a+b="+(a+b));
    }

}
public class Test {
    public static void main(String[] args) {
        Ts ts=new Ts();

    }
}

运行结果:

 

注意:

(1)只能在构造方法中用this()调用其他构造方法,不能在成员方法中使用this()。

(2)this只能出现在构造方法的第一行,且只能出现一次。

(3)不能形成环,也就是不能在一个类中的两个构造方法中使用this()互相调用。

2.3使用this引用调用成员方法

class Data{
    public int year;
    
    public  void setData(int year,int month,int day){
        this.year=year;       
    }
    public void printData(){
        System.out.println(this.year);
    }
    public void printData1(){
        this.printData();
    }
}

注意:在printData1()方法中通过this.printData1()访问printData()方法,注意此处的this关键字可以不写,效果是一样的。 

以上就是我要今天分享的内容啦,后续我还会继续更新的哒,常看我的博客会学到很多知识哦 

猜你喜欢

转载自blog.csdn.net/m0_63039919/article/details/123968532