子类能否继承父类的私有属性?

子类能否继承父类的私有属性?

参考:

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、继承会破坏封装?

封装: 其是指:隐藏属性,方法或实现细节的过程,仅对外公开接口。

继承: 在父类和子类之间存在着继承和扩展关系;子类继承父类的属性和方法的同时,子类还可以扩展出新的属性和方法,并且还可以覆盖父类中方法的实现方式。

各种设计模式,组合

使用接口(面对接口编程)

继承虽然不会对封装有太大影响,但是会带来耦合的问题

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值