Java中子类能继承父类的私有属性吗?

前段时间去听老师讲课的时候,老师告诉我子类是能够继承父类全部的属性和方法的。当时我是极其疑惑的,由于以前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法。老师给个人解释是这样的——先看下面一段代码测试

/**
 * 定义父类
 * @author CBS
 */
public class Father {
    private String name;//私有属性
    private char sex;
    
    public void tell(){
        System.out.println(name+sex);
    }
    
    private void speak(){
        System.out.println(name+"is speaking!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

}
/** * 定义子类,子类中什么都不写。 * @author CBS */ public class Child extends Father { }
/** * 定义测试类 * @author CBS */ public class Test { public static void main(String[] args) { Child c=new Child(); c.tell();//tell方法是能够用的 //c.speak();//报错,父类的私有方法不可见 } }

咱们能够看到测试类中即便没有给Child类对象的属性进行赋值,tell方法依旧是可用的。若是Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的全部东西,而修饰符只是影响属性或者方法对外是否可见。this

可是我的比较赞成Java官方文档的解释:子类不能继承父类的私有属性,可是若是子类中公有的方法影响到了父类私有属性,那么私有属性是可以被子类使用的。spa

Java中修饰符的做用是封装类中的属性和方法使其对外不可见,官方文档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提升代码的重用性,封装则保护了代码的不可见部分。在编写代码的过程当中,咱们显然即想提升代码的重用性,也不但愿类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就生活中的例子来讲,Java官方文档的解释也很契合。好比,咱们不可能彻底继承父母的一切(如性格等),可是父母的一些没法继承的东西却仍会深入的影响着咱们。code

固然以上的这些理由并不充分,只是笔者的我的看法。关于继承的问题,知乎对此也有讨论,下面这个帖子总结的比较全面,证据也很充足,你们能够去看看:对象

连接:https://www.zhihu.com/question/51345942/answer/145388196  做者:Robinblog

相关文章
相关标签/搜索