java override方法_Java override方法重写学习笔记

下面是自己学习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修改为下面的代码,先调用父类的方法再执行自己需要的部分则能解决该问题:

 代码如下复制代码

class KComponent extends JPanel {

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawString("King's", 150, 150);

}

}

实际上更好的修改方法是去掉KComponent,直接使用JLabel组件来显示”King’s”文本,而不是通过重写父类API的方式。

我们在重写不熟悉的API中的方法的时候一定要谨慎是否存在这样的问题,我一般在开发RCP等界面程序需要重写父类方法的时候都会仔细看看其父类API中是否有做一些不能取消的动作,如果是的话需要小心的处理重写的过程,因为一旦出现这种问题Debug的时候会很难找到问题产生的原因。

比如在RCP项目中,我们经常会扩展TitleAreaDialog组件实现我们自己的对话框,通常我们都需要重写其中的buttonPressed方法来处理对话框提交或者Refresh等事件。这里也有类似的问题,我们先看父类API中这个方法的代码:

 代码如下复制代码
protected void buttonPressed(int buttonId) {

if (IDialogConstants.OK_ID == buttonId) {

okPressed();

} else if (IDialogConstants.CANCEL_ID == buttonId) {

cancelPressed();

}

}

很显然默认的buttonPressed方法只检测OK_ID和CANCEL_ID两种情况,如果是CANCEL_ID则执行cancelPressed方法关闭对话框,如果是OK_ID则默认的okPress()是空实现。

这时候如果你可以选择去重写okPress方法实现这个目的而不是重写buttonPressed,但是如果你自定义了Button ID,必须重写buttonPressed方法那么需要注意在重写的方法最后调用super.buttonPressed(buttonId),利用父类的方法来处理CANCEL_ID按钮点击的事件,否则你会发现Cancel按钮失去了原有的作用,而你不得不手动去实现这个过程,即使你实现了这一过程,这样的代码也可能会有潜在的风险。所以我们在重写父类API的时候应该尽量小心。

 代码如下复制代码

@Override

protected void buttonPressed(int buttonId) {

// TODO Auto-generated method stub

if (buttonId == IDialogConstants.OK_ID) {

if (CaptionUtil.isEmpty(usernameText.getText())) {

this.setErrorMessage("用户名不能为空");

usernameText.setFocus();

return;

}

if (!checkLogonAtDb(usernameText.getText(), passwordText.getText())) {

return;

}

} else {

super.buttonPressed(buttonId);

}

}

总结一下

1、子类中的方法与父类中的方法有相同的返回类型

2、子类中的方法与父类中的方法有相同的方法名称

3、子类中的方法与父类中的方法有相同的参数列表

4、子类中的方法的访问级别不能低于父类中该方法的访问级别(举例:父类方法的级别是protected,那么子类重写该方法,其级别必须是protected或者public,一定和父类的访问级别相同或者更宽,否则编译无法通过)

5、子类中方法抛出的异常范围不能大于父类中方法抛出的异常的范围(子类可以不抛出异常也满足该原则,即是说父类抛出异常,子类不抛出异常,编译通过没问题。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值