方法重载、方法重写

博客概要

     简单分享重写和重载,从各自的概念、定义、使用以及区别展开介绍~

 

 

方法重载、方法重写区别

方法重写方法重载
OverridingOverloading
发生在继承类中发生在一个类中
方法名、参数类型、返回值 
全部相同
方法名相同 
参数类型或个数不同
被重写的方法
不能拥有更严格的权限
对权限没有限制

方法重载

     “方法重载”,发生在同一个类中,是在一个类中定义了多个同名方法,它们或有不同的参数个数、或有不同的参数类型、或者有不同的参数顺序等,下面举个栗子。

<具体代码>

<span style="color:#000000"><code class="language-java"><span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Person <span style="color:#999999">{</span>
    <span style="color:#6b7394">//定义参数</span>
    String name <span style="color:#ac9739">=</span> <span style="color:#ac9739">"wcw"</span><span style="color:#999999">;</span>
    String sex <span style="color:#ac9739">=</span> <span style="color:#ac9739">"boy"</span><span style="color:#999999">;</span>
    <span style="color:#6679cc">int</span> age <span style="color:#ac9739">=</span> <span style="color:#ac9739">3</span><span style="color:#999999">;</span>

    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:"</span> <span style="color:#ac9739">+</span> name <span style="color:#ac9739">+</span> <span style="color:#ac9739">",\t性别:"</span> <span style="color:#ac9739">+</span> sex <span style="color:#ac9739">+</span> <span style="color:#ac9739">"\t年龄:"</span> <span style="color:#ac9739">+</span> age<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span>String n<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:"</span> <span style="color:#ac9739">+</span> n<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span>String n<span style="color:#999999">,</span> String s<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:"</span> <span style="color:#ac9739">+</span> n <span style="color:#ac9739">+</span> <span style="color:#ac9739">",\t性别:"</span> <span style="color:#ac9739">+</span> s<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span>String n<span style="color:#999999">,</span> String s<span style="color:#999999">,</span> <span style="color:#6679cc">int</span> a<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:"</span> <span style="color:#ac9739">+</span> n <span style="color:#ac9739">+</span> <span style="color:#ac9739">",\t性别:"</span> <span style="color:#ac9739">+</span> s <span style="color:#ac9739">+</span> <span style="color:#ac9739">"\t年龄:"</span> <span style="color:#ac9739">+</span> a<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#6b7394">/**
     * 白盒测试
     * @param args
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">static</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span>String<span style="color:#999999">[</span><span style="color:#999999">]</span> args<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        Person person <span style="color:#ac9739">=</span> <span style="color:#6679cc">new</span> Person<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        person<span style="color:#999999">.</span><span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        person<span style="color:#999999">.</span><span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span><span style="color:#ac9739">"wcw2"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        person<span style="color:#999999">.</span><span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span><span style="color:#ac9739">"wcw3"</span><span style="color:#999999">,</span> <span style="color:#ac9739">"lady"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        person<span style="color:#999999">.</span><span style="color:#3d8fd1">wcw</span><span style="color:#999999">(</span><span style="color:#ac9739">"wcw4"</span><span style="color:#999999">,</span> <span style="color:#ac9739">"boy"</span><span style="color:#999999">,</span> <span style="color:#ac9739">23</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

<运行结果>

     在以上栗子中,有多个相同方法名的“wcw”方法,但每个方法的参数列表不同,通过传入相应的参数,来实现方法重载的使用。这也就是”方法重载“在一个类多态的一种表现,让类以统一的方式处理不同类型数据的一种手段,使得调用方法时,可以通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法。

方法重写

     方法重写发生在类的继承之中,在子类中重写的方法必须和父类方法在方法名、参数类型、返回值等方面全部相同,并且子类可以定义新的特征,当子类可以修改父类的特征,进行扩展、增大功能,下面举个栗子:
<具体代码>

<span style="color:#000000"><code class="language-java"><span style="color:#6b7394">//父类 - 人大类</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Person <span style="color:#999999">{</span>
    <span style="color:#6b7394">/**
     * 打印姓名
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:wcw"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
    <span style="color:#6b7394">/**
     * 打印年龄
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">age</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"年龄:3"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

<span style="color:#000000"><code class="language-java"><span style="color:#6b7394">//子类 - 具体人</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Wcw <span style="color:#6679cc">extends</span> Person<span style="color:#999999">{</span>
    <span style="color:#6b7394">/**
     * 打印姓名
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"姓名:wcw"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
    <span style="color:#6b7394">/**
     * 打印年龄
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">age</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"年龄:23"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
    <span style="color:#6b7394">/**
     * 打印性别
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">sex</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"性别:boy"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

<span style="color:#000000"><code class="language-java"><span style="color:#6b7394">//测试</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Test <span style="color:#999999">{</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">static</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span>String<span style="color:#999999">[</span><span style="color:#999999">]</span> args<span style="color:#999999">)</span> <span style="color:#999999">{</span>
    	<span style="color:#6b7394">//调用父类</span>
        Person p <span style="color:#ac9739">=</span> <span style="color:#6679cc">new</span> Person<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        p<span style="color:#999999">.</span><span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        p<span style="color:#999999">.</span><span style="color:#3d8fd1">age</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

		<span style="color:#6b7394">//调用子类</span>
        Wcw w <span style="color:#ac9739">=</span> <span style="color:#6679cc">new</span> Wcw<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        w<span style="color:#999999">.</span><span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        w<span style="color:#999999">.</span><span style="color:#3d8fd1">age</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        w<span style="color:#999999">.</span><span style="color:#3d8fd1">sex</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

<运行结果>

     以上这个栗子中,“Wcw”类继承自“Person”类,继承“Person”父类方法,也有自己子类的定义和方法,由此可见,“方法重写”是建立在继承关系上的。其实按博主自己的理解来说,重写就是子类在继承父类相同“方法框架”下,可以按需求更改“方法体定义”来实现功能。

     这里需要留心的是方法体定义问题,子类的对象在使用父类方法时,将调用子类中自己的定义,对子类而言,父类中的方法定义就如同被“屏蔽”了一样。在栗子中,“Wcw”子类在使用“Person”父类的“age”方法时,使用了“Wcw”中“age”方法自己的定义,在测试输出的时候,结果就会显示为“23”,而不是父类中定义的“3”了,如同最后运行结果中红框区域所示。

     而橙框区域所示的“sex”方法,是“Wcw”子类自己定义的新方法,是对“Person”父类的一种拓展,这是父类与子类之间多态的一种表现,使语言结构更加丰富。

【PS】其实重写还有一些需要注意的地方:
1.访问权限问题:如果父类方法是private修饰的,那么就只能被自己访问,在子类中也就是不能被重写的
2.抛出异常问题:这块博主也还不太懂= =有待考证
3…


     其实在继承中,子类既可以重写、继承父类的方法,也可以访问父类的方法,这就需要用到“super”关键字,下面觉一个简单的栗子。

<具体代码>

<span style="color:#000000"><code class="language-java"><span style="color:#6b7394">//父类 - 人大类</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Person <span style="color:#999999">{</span>
    <span style="color:#6b7394">/**
     * 打印姓名
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"父类姓名:wcw"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
<span style="color:#000000"><code class="language-java"><span style="color:#6b7394">//子类 - 具体人</span>
<span style="color:#6679cc">public</span> <span style="color:#6679cc">class</span> Wcw <span style="color:#6679cc">extends</span> Person<span style="color:#999999">{</span>
    <span style="color:#6b7394">/**
     * 打印姓名
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">{</span>
        <span style="color:#6679cc">super</span><span style="color:#999999">.</span><span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        System<span style="color:#999999">.</span>out<span style="color:#999999">.</span><span style="color:#3d8fd1">println</span><span style="color:#999999">(</span><span style="color:#ac9739">"子类姓名:wcw"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#6b7394">/**
     * 白盒测试
     * @param args
     */</span>
    <span style="color:#6679cc">public</span> <span style="color:#6679cc">static</span> <span style="color:#6679cc">void</span> <span style="color:#3d8fd1">main</span><span style="color:#999999">(</span>String<span style="color:#999999">[</span><span style="color:#999999">]</span> args<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        Wcw wcw <span style="color:#ac9739">=</span> <span style="color:#6679cc">new</span> Wcw<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        wcw<span style="color:#999999">.</span><span style="color:#3d8fd1">name</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

<运行结果>

     所以由栗子可知,“super”关键字可以让子类调用父类的方法或者方法参数等,其实也可以把父类“new”出来再使用,不过这代码就多了= =


总结

     “方法重写”和“方法重载”其实是Java多态性的两种不同表现,这里面也包含了继承的相关知识,其实关于面向对象的理解,之前有老师和博主讲过,有些工作了几年的人也还可能没有充分弄清楚,所以…“任重而道远”啊= =关于“面向对象”、“继承”、“多态”等概念,博主会在后续的博文中继续分享,和大家一起学习进步啦~

参考资料

【1】方法重写和方法重载的区别
【2】方法重写与方法重载的区别 
【3】…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值