当前位置 博文首页 > m0_48462648的博客:关于继承中调用成员变量和局部变量以及如何

    m0_48462648的博客:关于继承中调用成员变量和局部变量以及如何

    作者:[db:作者] 时间:2021-08-02 09:52

    有些伤口,无论过多久,依然一碰就痛;有些人,不管过多久,也还是一想起就疼

    在这里插入图片描述
    大家好,又是迷人的一天开始了

    1、今天我们首先解决父类的私有属性调用的问题

    比如,之前我们了解到,继承,如果一个子类和继承了一个父类,我们在测试类里面,就可以调用父类以及子类的方法,但是我们不得不考虑一个问题,那就是如果子类和父类有相同的名字的属性,或者相同名字的方法,那么测试类最后到底调用的是谁?

    我们直接上级,先直接创建父类

    //父类
    public class Fu {
        
    }
    

    随后子类:

    //子类
    public class Zi {
        
    }
    

    测试类:

    //测试类
    public class TestA {
        
    }
    

    随后我们让子类继承父类,并在父类中创建私有属性set

    public class Zi  extends Fu{
    
    }
    
    public class Fu {
        private String sex="csdn";
    }
    

    ~~ ~~
    我们在测试类调用:
    在这里插入图片描述我们可以发现根本调用不了,那肯定会有大聪明想着可以不可以用构造方法或者get或者set获取呢?
    我们要搞清楚一点,子类继承父类确实可以继承父类的私有属性,但是子类却无法调用父类的私有属性,就像张三爸爸的养老钱,张三虽然继承了家产,但是这钱他能用吗?他不能用,这构成什么?这是不孝,他不能用,那get和set或者构造方法呢,我么之前学习的,不用继承,就可以通过get和set获取一个类的属性,就是即使不是张三,其他人也能调用家产,更不要说有继承这个关系了!
    在这里插入图片描述所以,子类是可以通过getset方法获取父类的私有,但是没这个必要,父类既然设置私有了,你调取干什么?

    所以总结出一点:

    子类虽然可以继承父类的私有属性,但是无法调用

    2、那么问题又来了,如果子类和父类都有一个属性,并且这个属性的名字一模一样,那么我们在测试时,调用的是谁?

    还是刚刚的父类,我们把权限修饰符换了

    //父类
    public class Fu {
        public String sex="csdn";
    }
    

    然后把这个属性复制到子类一份:

    //子类
    public class Zi  extends Fu{
        public String sex="我是子类的csdn";
    }
    

    随后再测试类中编写:

    //测试类
    public class TestA {
        public static void main(String[] args) {
            Zi zi = new Zi();
            System.out.println(zi.sex);
        }
    }
    
    

    运行结果:
    在这里插入图片描述
    由上所述,我们得出结论:

    当子类父类有相同名字的属性时,我们先调用子类的属性,子类如果没有这个属性,才会调用父类的属性

    在这里插入图片描述

    那又有问题了,那我们想调用父类重名的属性或者再子类的同名的局部变量调用子类同名的成员变量,这几个变量又该如何区分呢?

    我们再子类中添加方法aa,参数也设置成String的sex,随后输出方法内的参数

    //子类
    public class Zi  extends Fu{
        public String sex="我是子类的csdn";
    
        //创建方法
        public void aa(String sex){
            System.out.println(sex);
        }
    }
    

    随后再测试类中引入方法进行打印:

    //测试类
    public class TestA {
        public static void main(String[] args) {
            Zi zi = new Zi();
            System.out.println(zi.sex);
            System.out.println("-------------------------");
            zi.aa("我是子类方法中的参数");
        }
    }
    

    打印结果:
    在这里插入图片描述
    我们可以知道,我们测试类中已经可以调用子类中的方法了,那么如果再子类方法中调用子类的同名成员变量以及在子类中调用父类的同名成员变量呢?
    这里我们要使用两个关键字:

    this
    super

    this这个词很好理解,单独调用的时候,它指向的是当前类的成员变量
    那么super呢?他指向的是父类中的成员变量,具体使用方法如下,我们在子类的aa方法中添加

    在这里插入图片描述代码:

    //子类
    public class Zi  extends Fu{
        public String sex="我是子类的csdn";
    
        //创建方法
        public void aa(String sex){
            System.out.println(sex);
            System.out.println(this.sex);
            System.out.println(super.sex);
        }
    }
    

    在这里插入图片描述然后直接打印即可:
    在这里插入图片描述

    我们可以得出:

    如果局部变量、成员变量、方法参数名称一致的话,我们可以通过this、super关键字进行调取

    在这里插入图片描述在这里插入图片描述

    cs