专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java覆盖父类的方法

Java基础学习:java覆盖父类的方法

更新时间:2020-04-21 14:22:50 来源:动力节点 浏览4981次

    JAVA本身并不提供子类“覆盖”父类成员变量的方法,而事实上,从面相对象的角度上来说,子类也不应当可以“覆盖”父类的成员变量。但有时候我们就是有这种需求,比如:

    Java

Java基础学习:java覆盖父类的方法

    我们期望能够打印出

    Dad

    但实际上会打印出

    Person

    原因分析

    实际上,即使子类声明了与父类完全一样的成员变量,也不会覆盖掉父类的成员变量。而是在子类实例化时,会同时定义两个成员变量,子类也可以同时访问到这两个成员变量,但父类不能访问到子类的成员变量(父类不知道子类的存在)。而具体在方法中使用成员变量时,究竟使用的是父类还是子类的成员变量,则由方法所在的类决定;即,方法在父类中定义和执行,则使用父类的成员变量,方法在子类中定义(包括覆盖父类方法)和执行,则使用子类的成员变量。

    解决方法

    采用get()/set()

    Java

Java基础学习:java覆盖父类的方法

    得到结果:

    Dad

    由于dad.getName()执行的是子类中重载父类的getName(),因此返回的也是子类中定义的name。这种方法最为推荐,但用起来也繁琐一些。因为这种方法同时维护了两个相同的成员变量,因此使用起来也得小心一些。

    使用父类成员函数

    Java

Java基础学习:java覆盖父类的方法

    得到结果:

    Dad

    这种方法是在子类的构造函数上做文章。子类的hisName即子类自己的成员变量,但只在构造函数中使用,而在构造函数中就是通过super给父类的成员变量赋值。这样做的好处就是只有一个成员变量,没有出现真正的“覆盖”的问题,而且父类和子类中的方法也可以放心大胆用这个成员变量,不用担心隐藏的问题;坏处当然就是不太“正规”了。

    通过static块

    Java

   Java基础学习:java覆盖父类的方法

    得到结果:

    Dad

    这个方法和上面的那个很像,但从原理上来说还是有些区别的。static块会在类初始化而不是实例化时被执行,而父类中的static成员变量会在子类static块执行前就定义完成,所以子类初始化时会修改父类的成员变量值,子类实例化时自然得到的父类成员变量值也是修改过的,这样完成了“覆盖”。

    这种方法就像:

    Java

    publicclassDadextendsPerson{

    name="Dad";

    }

    但上面这段代码是错误的,JAVA中变量是不能在方法之外进行赋值操作的;而static块恰恰是利用了JAVA会无条件执行staitc块这一特性,达到了这个目的。这种方法说坏处的话,估计就是成员变量必须是static了。

 以上就是动力节点java培训机构的小编针对“Java基础学习:java覆盖父类的方法”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>