Java学习笔记59——继承super关键字

继承super关键字

继承与成员的关系

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);//30
        //通过this关键字去访问成员变量
        this.a=a;
        System.out.println(this.a);//40 
    }
}
​
public class ExtendsDemo1 {
    public static void main(String[] args) {
//调用fun2,创建对象
        DemoZi demoZi = new DemoZi();
        demoZi.fun2();
​
    }
}

方法访问的顺序是:当前方法里的局部变量→当前类的成员变量→当前子类所继承的父类的成员变量

注意:方法与方法之间是相互隔绝的,里面的局部变量相互之间是访问不到的 。所以子类方法访问不到父类方法里的局部变量

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

如果有一样东西,和this相似,可以直接访问父类的数据就好了

通过学习后发现,java给我们提供了这样的一个关键字实现这一功能:super

面试题:this关键字与super关键字的区别

this代表的是当前对象的引用

super代表的是当前对象的类继承的父类的引用(可以直接操作父类中的成员)

super与this的使用格式:

1、访问成员变量:

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);//30
        //通过this关键字去访问成员变量
        System.out.println(this.a);//40
        //通过super关键字访问成员变量
        System.out.println(super.a);//10
    }
}

如果我再加一个DemoSun的类,那么如果在DemoSun这个类中访问到Demo类中的成员变量呢

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);//30
        //通过this关键字去访问成员变量
        System.out.println(this.a);//40
        //通过super关键字访问成员变量
        System.out.println(super.a);//10
    }
}
​
class DemoSun extends DemoZi{
    //int a=50;
​
    //如果本类找不到变量去直接继承父类中查找
    public void fun3(){
        System.out.println(a);//40
    //super关键字只能代表直接父类的引用,不能跨层引用
        System.out.println(super.a);//40
    //在fun3里定义一个的Demo类型的demo局部变量,这时候就可以访问Demo类中的a
        Demo demo = new Demo();
        System.out.println(demo.a);//10
​
    }
}

2、访问成员方法:

super.成员方法(访问的是父类的成员方法)

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

子类不能调用父类的私有成员(被private修饰的成员)

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);//30
        //通过this关键字去访问成员变量
        System.out.println(this.a);//40
        //通过super关键字访问成员变量
        System.out.println(super.a);//10
    }
}
​
class DemoSun extends DemoZi{
    //int a=50;
​
    //如果本类找不到变量去直接继承父类中查找
    public void fun3(){
        System.out.println(a);//40
    //super关键字只能代表直接父类的引用,不能跨层引用
        System.out.println(super.a);//40
    //在fun3里定义一个的Demo类型的demo局部变量,这时候就可以访问Demo类中的a
    //    Demo demo = new Demo();
    //    System.out.println(demo.a);//10
        super.fun2();//20 30 40 10
    }
​
    public void fun4(){
        this.fun3();
        this.fun2();
    }
}

3、访问构造方法:

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

this(...)(访问笨了中的构造方法)

posted @ 2021-12-10 19:00  欧朋  阅读(79)  评论(0)    收藏  举报