某些书本表明“子类只能继承父类的非私有属性和方法”,然而事实并非如此,实际上“Java中子类可以继承父类所有的属性和方法”,只不过因为私有的原因,子类不能调用父类的私有方法。
//父类
public class Father {
private String name = "张三";//私有属性
private String sex = "男";
public void tell(){
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
}
private void speak(){
System.out.println(name+"is speaking!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
//子类
public class Child extends Father {
}
//测试类
public class TestJava {
public static void main(String[] args) {
Child c = new Child();
c.tell();// tell方法是可以用的
// c.speak();//报错,父类的私有方法不可见
}
}
可以看到测试类中即使没有给Child类对象的属性进行赋值,tell方法依旧是可用的。如果Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的所有东西,而修饰符只是影响属性或者方法对外是否可见。
Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。