下面是自己学习java时总结一些关于Java override方法重写学习笔记,下面记录一下同时也给需要学习了解的朋友一些帮助哦。
重载Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。那么如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载?结果是不行的。,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java 就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
重写Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法
重写(Override)API方法时的陷阱
在写Java应用程序的过程中,我们经常需要扩展API中的类,重写API中的函数,但是在这个过程中也有可能会出现意想不到的问题。你需要确认你重写这个父类的方法会不会带来负面的影响。
比如最近在SOSO问问上碰到一个比较有意思的问题,他在使用Swing的过程中,设置一个JPanel组件的背景色的时候发现背景色并没有改变,代码如下
代码如下 | 复制代码 | ||||||||||||
package com.lvjava; import java.awt.*; import javax.swing.*; public class BackgroundTest { public static void main(String[] args) { new KFrame(); } } class KFrame extends JFrame { KFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 500); setVisible(true); JPanel component = new KComponent(); add(component); component.setBackground(Color.YELLOW); } } class KComponent extends JPanel { public void paintComponent(Graphics g) { g.drawString("King's", 150, 150); } } 这段代码看起来没有问题,运行的时候很奇怪为什么 component.setBackground(Color.YELLOW);这个语句没有起作用。 问题出在了KComponent对象继承JPanel的时候重写了paintComponent方法上,因为绘制背景色的过程就是在 paintComponent()方法中实现的,原作者重写了该方法,所以父类中的这个方法不再被执行,而作者又没有添加相关绘制背景色的方法,则运行的时候只会显示绘制文字King’s,而不是对背景色有任何的改动。如果我们直接将KComponent修改为下面的代码,先调用父类的方法再执行自己需要的部分则能解决该问题:
|