博客概要
简单分享重写和重载,从各自的概念、定义、使用以及区别展开介绍~
方法重载、方法重写区别
方法重写 | 方法重载 |
---|---|
Overriding | Overloading |
发生在继承类中 | 发生在一个类中 |
方法名、参数类型、返回值 全部相同 | 方法名相同 参数类型或个数不同 |
被重写的方法 不能拥有更严格的权限 | 对权限没有限制 |
… | … |
方法重载
“方法重载”,发生在同一个类中,是在一个类中定义了多个同名方法,它们或有不同的参数个数、或有不同的参数类型、或者有不同的参数顺序等,下面举个栗子。
<具体代码>
<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】…