面向对象--继承--super关键字

super关键字 

super的用法和this很像

this代表本类对应的引用。

super代表父类存储空间的标识(可以理解为父类引用)

super与this的使用格式:

  • 访问成员变量:

super.成员变量 (访问的是直接父类的成员变量)
this.成员变量    (访问的是本类中成员变量,可以是访问继承自父类中的成员变量)

  • 访问成员方法:

super.成员方法 (访问的是直接父类的成员方法)
this.成员方法    (访问的是本类中的方法,可以是访问继承自父类中的成员方法)

  • 访问构造方法:

super(...)    (访问父类构造方法的方式)
this(...)       (访问本类中的构造方法)

程序示例

/*
        继承与成员的关系
            思考:
                现在我们清楚了继承去访问成员的顺序,但是我们想想不仅要输出本类范围中的成员
                我还想输出父类中的同名的成员,怎么办呢?

            如果有一样东西,和this相似,可以直接访问父类的数据就好了
            通过学习后发现,有这样的一个东西,
            java提供了一个关键字给我们使用:super

            面试题:this关键字与super关键字的区别
                  this代表的是当前对象的引用
                  super代表的是当前对象的类继承的父类的引用(可以直接操作父类中的成员)


            super与this的使用格式:
                访问成员变量:
                    super.成员变量 (访问的是直接父类的成员变量)
                    this.成员变量  (访问的是本类中成员变量,可以是访问继承自父类中的成员变量)
                访问成员方法:
                    super.成员方法 (访问的是直接父类的成员方法)
                    this.成员方法  (访问的是本类中的方法,可以是访问继承自父类中的成员方法)
                访问构造方法:
                    super(...)    (访问父类构造方法的方式)
                    this(...)     (访问本类中的构造方法)

*/

class Demo{
    int a = 10;
    public void fun1(){
        int a = 100;
        System.out.println(a);
    }
}

class DemoZi extends Demo{
    int b = 20;
    int a = 40;
    public void fun2(){
          int a = 30;
      
            System.out.println(b);//输出20
      
            System.out.println(a);//输出DemoZi的fun2局部变量30
      
  //----------通过this关键字去访问本类成员变量----------
      
        System.out.println(this.a);//输出结果40 
      
  //----------通过super关键字访问父类的成员变量----------
      
        System.out.println(super.a);//输出10
    }
}


class DemoSun extends DemoZi{
//   把当前类成员变量a注释掉
//    int a = 50;
    public void fun3(){
      
//----------如果本类找不到变量去直接继承父类中查找----------
        System.out.println(a);//把本类中成员变量注释掉之后输出直接父类中继承过来的a--输出40
      
//----------super关键字只能代表直接父类的引用,不能跨层引用----------
        System.out.println(super.a);//输出的为直接父类DemoZi中的成员变量a--输出40
      
//----------当多层继承超过两层之后最上面一层就很难访问到了,只能通过创建对象去访问----------    
            //Demo demo = new Demo();
            //System.out.println(demo.a);
      
//----------访问父类的fun2你可以通过super去访问,也可以直接去访问,因为继承过来了----------
        System.out.println("访问父类的fun2");
//----------super关键字只能代表直接父类的引用,不能跨层引用----------
        super.fun2();
    }

    public void fun4(){
      //this 访问本类的成员方法
        this.fun3();
      
      //this 不仅可以访问本类的成员方法,还可以访问继承自父类的成员方法
        this.fun2();
      
      //this 不仅可以访问本类的成员变量,还可以访问继承自父类的成员变量
            System.out.println(this.b);
    }
}

public class ExtendsDemo1 {
    public static void main(String[] args) {
        DemoZi demoZi = new DemoZi();
        demoZi.fun2();

        DemoSun d = new DemoSun();
        d.fun3();
            d.fun4();     
    }
}
posted @ 2021-12-10 16:28  赤兔胭脂小吕布  阅读(30)  评论(0编辑  收藏  举报