栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么超类的实例变量没有被子类覆盖?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么超类的实例变量没有被子类覆盖?

为什么在子类方法中不覆盖超类的实例变量,请参见下面的代码…

因为实例变量不能在Java中覆盖。在Java中,只能重写方法。

当你声明一个与超类中现有字段同名的字段时,新字段将隐藏现有字段。超类中的现有字段仍存在于子类中,甚至可以使用…遵守常规的Java访问规则。

因为实例变量在Java中无法被覆盖,但是为什么呢?为什么在Java中以这种方式完成?什么原因?

他们为什么这样设计?

  1. 因为覆盖变量将从根本上破坏超类中的代码。例如,如果重写更改了变量的类型,则很可能会更改在使用原始变量的父类中声明的方法的行为。最糟糕的是,它使它们无法编译。

例如:

   public class Sup {       private int foo;       public int getFoo() {return foo;       }   }   public class Sub extends Sup {       private int[] foo;       ...   }

如果Sub.foo覆盖(即替换)Sup.foo,如何getFoo()工作?在子类上下文中,它将试图返回错误类型的字段的值!

  1. 如果被覆盖的字段不是私有字段,那就更糟了。这将以相当根本的方式打破《里斯科夫可替代性原则》。这就消除了多态性的基础。

  2. 在另一面,覆盖领域起不到任何能不能做到更好的在其他方面。例如,一个好的设计将所有实例变量都声明为私有,并根据需要为其提供getter / setter方法。可以覆盖getter / setter ,并且直接使用私有字段或声明getter / setter的父类可以“保护”自身免受不希望的覆盖final。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/517735.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号