This和Super关键字

    xiaoxiao2021-03-25  92

    This

    this关键字必须放在非静态方法里面

    this关键字代表自身,在程序中主要的使用用途有以下几个方面:

    ? 使用this关键字引用成员变量

    ? 使用this关键字在自身构造方法内部引用其它构造方法

    ? 使用this关键字代表自身类的对象

    ? 使用this关键字引用成员方法

    8.8.1.1 引用成员变量

    在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,有些时候可以省略,有些时候不能省略。首先看一下下面的代码:

    /**

    * 使用this引用成员变量

    */

    public class ReferenceVariable {

    private int a;

    public ReferenceVariable(int a){

    this.a = a;}

    public int getA(){

    return a;}

    public void setA(int a){

    this.a = a;}}

    在该代码的构造方法和setA方法内部,都是用this.a引用类的成员变量。因为无论在构造方法还是setA方法内部,都包含2个变量名为a的变量,一个是参数a,另外一个是成员变量a。按照Java语言的变量作用范围规定,参数a的作用范围为构造方法或方法内部,成员变量a的作用范围是类的内部,这样在构造方法和setA方法内部就存在了变量a的冲突,Java语言规定当变量作用范围重叠时,作用域小的变量覆盖作用域大的变量。所以在构造方法和setA方法内部,参数a起作用。

    这样需要访问成员变量a则必须使用this进行引用。当然,如果变量名不发生重叠,则this可以省略。

    但是为了增强代码的可读性,一般将参数的名称和成员变量的名称保持一致,所以this的使用频率在规范的代码内部应该很多。

    8.8.1.2 引用构造方法

    在一个类的构造方法内部,也可以使用this关键字引用其它的构造方法,这样可以降低代码的重复,也可以使所有的构造方法保持统一,这样方便以后的代码修改和维护,也方便代码的阅读。

    下面是一个简单的示例:

    /**

    * 使用this关键字引用构造方法

    */

    public class ReferenceConstructor {

    int a;

    public ReferenceConstructor(){

    this(0);

    }public ReferenceConstructor(int a){

    this.a = a;}}

    这里在不带参数的构造方法内部,使用this调用了另外一个构造方法,其中0是根据需要传递的参数的值,当一个类内部的构造方法比较多时,可以只书写一个构造方法的内部功能代码,然后其它的构造方法都通过调用该构造方法实现,这样既保证了所有的构造是统一的,也降低了代码的重复。

    在实际使用时,需要注意的是,在构造方法内部使用this关键字调用其它的构造方法时,调用的代码只能出现在构造方法内部的第一行可执行代码。这样,在构造方法内部使用this关键字调用构造方法最多会出现一次。

    8.8.1.3 代表自身对象

    在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this,实际使用this代表自身类的对象的示例代码如下:

    /**

    * 使用this代表自身类的对象

    */

    public class ReferenceObject {

    ReferenceObject instance;

    public ReferenceObject(){

    instance = this;}

    public void test(){

    System.out.println(this);}}

    在构造方法内部,将对象this的值赋值给instance,在test方法内部,输出对象this的内容,这里的this都代表自身类型的对象。

    8.8.1.4 引用成员方法

    在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用,只是所有这样的引用中this都可以省略,所以这里就不详细介绍了。

    Super

    一.super关键字作用

     

    1:主要存在于子类方法中,用于指向子类对象中父类对象。

     

    2:访问父类的属性

     

    3:访问父类的函数

     

    4:访问父类的构造函数

    二.super注意的地方

     

    this和super很像,this指向的是当前对象的调用,super指向的是当前调用对象的父类。类加载完毕,创建对象,父类的构造方法会被调用(默认自动无参),然后执行子类相应构造创建了一个子类对象,该子类对象还包含了一个父类对象。该父类对象在子类对象内部。this super只能在有对象的前提下使用,不能在静态上下文使用。

     

    三.super关键字的使用

     

    1.子类的构造函数默认第一行会默认调用父类无参的构造函数,隐式语句

     

    super();

     

    [java] view plain copy

    print?

     

       Son(int y) { 

               //super();隐式语句 

               this.y = y + x; 

               System.out.println("这是子类的有参构造"); 

           } 

     

    2.子类显式调用父类构造函数

     

    在子类构造函数第一行通过super关键字调用父类任何构造函数。如果显式调用父类构造函数,编译器自动添加的调用父类无参数的构造就消失。构造函数间的调用只能放在第一行,只能调用一次。super()和this()不能同时存在构造函数第一行。

    [java] view plain copy

    print?

     

       Son(int y) { 

               super(y);// 子类显式调用父类构造函数 

               this.y = y + x; 

               System.out.println("这是子类的有参构造"); 

           } 

     

    四.super思考

     

    如果开发者自定义了一个类,没有显示的进行类的继承,那么该类中成员函数是否可以使用super关健健字?可以使用,继承了Object类,Object类是所有类的父类。

    [java] view plain copy

    print?

     

       class Demo7 { 

           public  void print(){ 

               System.out.println(super.toString()); 

           } 

           public static void main(String[] args){ 

               new Demo7().print(); 

               System.out.println(); 

               } 

       } 

    转载请注明原文地址: https://ju.6miu.com/read-20682.html

    最新回复(0)