问题描述
- 多态中变量为什么不能重写。方法却能,这两者有啥不同么?
-
为什么多态时,继承。变量不能重写。方法却能重写呢?。在继承时不是变量也能改变数值么???
解决方案
从语法的角度说,就是这么规定的。
从面向对象的角度讲,没有这个需求。方法是一个类的行为和接口,变量是一个类的状态和特征。多态的思想就是相同的接口,多种的实现。变量不是接口,不需要“多态”。
好比为什么洗衣粉不能吃。从生物化学的角度看,洗衣粉有毒。从洗衣粉的用途讲,洗衣粉是洗衣服用的,不是设计拿来吃的。
解决方案二:
一个道理,为什么语法规定变量不能重写,而方法能重写,也是根据编程语言的用途决定的。没有需要“变量重写”的用途。
解决方案三:
方法重写的原因是因为在不同的情况下有不同的用法,变量需要这个功能么?没有必要吧!想用的时候定义就好了呀
解决方案四:
从面向对象来说,确实是没有必要,重写是要改变它,如果你写成和父类一样,没有改变,如果写成和父类不一样,那就是常规的域声明了。从虚拟机层面来说,是因为虚拟机确定域时,不会像找方法一样动态搜索,而是根据声明类型直接确定(通过对象直接引用域时,注意,是可以在子类和父类同时声明同名域的)。
解决方案五:
vtable的指针是指向代码区的, 而变量不在代码区
解决方案六:
当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。
重写不能重写父类的私有方法,只能重写可继承的方法。重写是相对与方法的,不存在变量重写的概念。
时间: 2024-11-02 10:32:43