多态中变量和方法的一些思考

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

好的,闲话少说。

交代一下问题的背景说的是,父类和子类有相同的变量和方法,那么如在 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就让儿子来做吧,符合面向的接口思想。

参考资料:阿里多态重读

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独步秋风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值