博客
关于我
多态中变量和方法的一些思考
阅读量:494 次
发布时间:2019-03-07

本文共 1779 字,大约阅读时间需要 5 分钟。

今天下午,同事之间讨论面试时都是遇到了一些什么题目,有一个题目挺有趣的,不忍就让这个小知识点就这么溜走了,好记性不如。。不如写博客,嘿嘿。

好的,闲话少说。

交代一下问题的背景说的是,父类和子类有相同的变量和方法,那么如在 Father father = new Son(); 中父类的应用father调用变量和方法分别调用的哪个变量和方法?有点绕。。??那直接上代码

父类

public class Father {    //爸爸的胳膊长度    int arm_length = 60;    /**     * 买烟     * @return     */    public String buyTobacco(){        return "为父爱抽利群";    }}

子类

public class Son extends Father {    //儿子的胳膊长度    int arm_length = 65;    /**     * 买烟     * @return     */    public String buyTobacco(){        return "儿子爱抽黄鹤楼";    }}

测试类

public class Main {    public static void main(String[] args){        Father father =  new Son();        System.out.println("胳膊的长度:"+father.arm_length+"\n烟抽完了,谁去买烟:"+father.buyTobacco());//        Son son =  (Son)new Father(); //放开这段代码会输出什么,或者说会发生什么,大家可以试试//        System.out.println("胳膊的长度:"+son.arm_length+"\n烟抽完了,谁去买烟:"+son.buyTobacco());    }}

打印

胳膊的长度:60烟抽完了,谁去买烟:儿子爱抽黄鹤楼

可以看得出来,父类的引用调用的是父类的变量,调用的却是子类的方法。

为什么呢?

甲鱼的屁股-》规定

好了好了,看下专业的解释

问题描述

多态中变量为什么不能重写。方法却能,这两者有啥不同么?

为什么多态时,继承。变量不能重写。方法却能重写呢?。在继承时不是变量也能改变数值么???

解决方案

从语法的角度说,就是这么规定的(这句话不是我说的哈)。

从面向对象的角度讲,没有这个需求。方法是一个类的行为和接口,变量是一个类的状态和特征。多态的思想就是相同的接口,多种的实现。变量不是接口,不需要“多态”。

好比为什么洗衣粉不能吃。从生物化学的角度看,洗衣粉有毒。从洗衣粉的用途讲,洗衣粉是洗衣服用的,不是设计拿来吃的。

解决方案二

一个道理,为什么语法规定变量不能重写,而方法能重写,也是根据编程语言的用途决定的。没有需要“变量重写”的用途。

解决方案三:(
这句话最容易理解

方法重写的原因是因为在不同的情况下有不同的用法,变量需要这个功能么?没有必要吧!想用的时候定义就好了呀

解决方案四

从面向对象来说,确实是没有必要,重写是要改变它,如果你写成和父类一样,没有改变,如果写成和父类不一样,那就是常规的域声明了。从虚拟机层面来说,是因为虚拟机确定域时,不会像找方法一样动态搜索,而是根据声明类型直接确定(通过对象直接引用域时,注意,是可以在子类和父类同时声明同名域的)。

解决方案五

vtable的指针是指向代码区的, 而变量不在代码区

解决方案六: 当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。

重写不能重写父类的私有方法,只能重写可继承的方法。重写是相对与方法的,不存在变量重写的概念

总结:结合代码可知,变量是胳膊的长度,父子都有这个没有必要重写,引用在哪里,谁就表达自己的变量(属性)就可以了,

买烟是个动作,父子都要抽烟,这时候引用在父亲这,但是实例的却是儿子,并且还重写了父类的方法,那么这个action就让儿子来做吧,符合面向的接口思想。

参考资料:

转载地址:http://bxwcz.baihongyu.com/

你可能感兴趣的文章
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>
NetworkX:是否为每个节点添加超链接?
查看>>
network小学习
查看>>
Netwox网络工具使用详解
查看>>
Net与Flex入门
查看>>
Net任意String格式转换为DateTime类型
查看>>
net包之IPConn
查看>>
net发布的dll方法和类显示注释信息(字段说明信息)[图解]
查看>>
Net和T-sql中的日期函数操作
查看>>
Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用
查看>>
Net操作Excel(终极方法NPOI)
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
net网络查看其参数state_dict,data,named_parameters
查看>>
Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载
查看>>
NeurIPS(神经信息处理系统大会)-ChatGPT4o作答
查看>>
neuroph轻量级神经网络框架
查看>>
Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
查看>>
new Blob()实现不同类型的文件下载功能
查看>>
New Concept English three (35)
查看>>