Java中⼦类能继承⽗类的私有属性吗?
前段时间去听⽼师讲课的时候,⽼师告诉我⼦类是可以继承⽗类所有的属性和⽅法的。当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:⼦类只能继承⽗类的⾮私有属性和⽅法。⽼师给我的解释是这样的——先看下⾯⼀段代码
/**
* 定义⽗类
* @author CBS
*/
public class Father {
private String name;//私有属性java反射获取父类属性
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.speak();//报错,⽗类的私有⽅法不可见
}
}
我们可以看到测试类中即使没有给Child类对象的属性进⾏赋值,tell⽅法依旧是可⽤的。如果Child类中没有继承⽗类的私有属性,那么tell ⽅法应该会报错。由此得出的结论是,⼦类会继承⽗类的所有东西,⽽修饰符只是影响属性或者⽅法对外是否可见。
但是个⼈⽐较同意Java官⽅⽂档的解释:⼦类不能继承⽗类的私有属性,但是如果⼦类中公有的⽅法影响到了⽗类私有属性,那么私有属性是能够被⼦类使⽤的。
Java中修饰符的作⽤是封装类中的属性和⽅法使其对外不可见,官⽅⽂档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提⾼代码的重⽤性,封装则保护了代码的不可见部分。在编写代码的过程中,我们显然即想提⾼代码的重⽤性,也不希望类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就⽣活中的例⼦来说,Java官⽅⽂档的解释也很契合。⽐如,我们不可能完全继承⽗母的⼀切(如性格等),但是⽗母的⼀些⽆法继承的东西却仍会深刻的影响着我们。
当然以上的这些理由并不充分,只是笔者的个⼈见解。关于继承的问题,知乎对此也有讨论,下⾯这个帖⼦总结的⽐较全⾯,证据也很充⾜,⼤家可以去看看: