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