子类能否继承父类的私有属性?
参考:
https://blog.csdn.net/ql_7256/article/details/107428016
https://www.zhihu.com/question/61922420
Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setPrivateName("dog set animal 的 私有属性");
System.out.println(dog.getPrivateName());
}
}
//父类
class Animal{
//父类私有属性
private String privateName = "私有名字";
//get 和 set方法
public String getPrivateName() {
return privateName;
}
public void setPrivateName(String privateName) {
this.privateName = privateName;
}
}
//子类
class Dog extends Animal{
public Dog() {
}
}
假设:如果不继承,把父类中的方法用private修饰,子类就不会继承
尝试使用多态验证
将main方法写在Father类中
本质为Child 的c1 能够调用父类的私有方法
假设是否与访问修饰符有联系
protected:不同包:
在子类中,不同包中,受保护成员允许被继承,也就是说在子类的开发中,可以直接使用受保护成员的名字进行使用。子类的main方法中只能通过子类对象打点调用。父类对象不行,这个时候相当于父类中的受保护成员跨包了。
main方法在Father的同包内
main方法在Child的同包内
得出:
在继承关系中,子类从父类中继承下来的方法(不重写),它的权限修饰符是针对父类而言的
如果是重写了,那么这个方法的权限修饰符就是针对子类而言的
被子类继承的private方法,也是只对本类(父类)可见的,所以当然就可以在父类的main方法中运行被子类继承下去的private方法了。
子类继承了父类中被private修饰的方法。所以,方法当然可以被正常调用。
在继承关系中,父类中的private方法也是可以被子类继承的,只是这个被继承下来的方法,只针对父类可见。
结论正确的前提是:在多态形式下,调用实例方法的时候,最终运行的是子类中的方法。
所以可以得出子类继承了父类的私有属性和方法,但是因为private所以不能直接访问。
再次验证:
使用反射
Java中修饰符的作用是封装类中的属性和方法使其对外不可见,官方文档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提高代码的重用性,封装则保护了代码的不可见部分。在编写代码的过程中,我们显然即想提高代码的重用性,也不希望类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就生活中的例子来说,Java官方文档的解释也很契合。
浅谈本质
子类继承了父类就获得了父类的属性和方法”,这个“获得”,是什么意思?
所谓继承是指子类在自身的类中复制了父类可以继承的字段和方法,还是子类中持有一个父类?
子类对象隐式地持有了一个父类对象,这样子类既可以调用自己声明的方法,又可以调用父类声明的方法们中的可继承的那些。
继承不只是复制基类的接口,当创建了一个导出对象时,该对象包含了一个基类的子对象。——《Java编程思想》
设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来。尽可能地使每个类或者成员不被外界访问。——参考《Effective Java》
实际上使用:
所以子类可以通过继承自父类的setter和getter方法访问持有的父类的私有变量。
Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
私有的继承
在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。
1、继承会破坏封装?
封装: 其是指:隐藏属性,方法或实现细节的过程,仅对外公开接口。
继承: 在父类和子类之间存在着继承和扩展关系;子类继承父类的属性和方法的同时,子类还可以扩展出新的属性和方法,并且还可以覆盖父类中方法的实现方式。
各种设计模式,组合
使用接口(面对接口编程)
继承虽然不会对封装有太大影响,但是会带来耦合的问题