`
johanyi
  • 浏览: 5156 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大

阅读更多
在 java  中,当我们子类要重写父类中的方法,如果父类的方法有异常声明,那么子类重写这个方法时候,所要声明的异常不应该比父类的大。只能是小等,或者可以没有。原因如下。
假如我们自定意义一个异常:


public class MyException extends Exception {
public MyException(String message) { }
public MyException() { }
}
那么我们有一个父类它将有一个方法,将声明抛出这个异常。我们把它做成抽象的(无所谓)


public abstract class ParentException {
public abstract void test() throws MyException;
}


那么将有一个类使用到上面这个类


public class ExceptionTest {
private ParentException exception;
public ExceptionTest(ParentException exception){
this.exception=exception;
}
public void app(){
try {
exception.test();
} catch (MyException e) {
e.printStackTrace();
}
}
}


对于以上的try~catch 我们就直接捕获MyException异常。这是正确的,它在编译的时候是没有问题的。
假如,有一个ParentException的有一个子类


public class ChildException extends ParentException{
public void test() throws Exception{  }
}


他的方法可以声明抛出比父类大的异常,假如它是正确的。
那么问题来了。当我们执行ExceptionTest类的时候,我们以这个子类做为对象传进去。
exception.test();这个地方将在运行的时候实际调用的是ChildException这个子类的test()方法,而它的声明抛 出却是比父类大的异常,这就使得在ExceptionTest类中,捕获异常处出现了毛病,因为它无法捕获Exception异常。
综上所诉,子类重写父类的方法时候不能声明抛出比父类大的异常。

本文转载自CSDN博客,原文链接:http://blog.csdn.net/a564663276/article/details/8956187
分享到:
评论

相关推荐

    java子类重写父类的方法.doc

    子类重写父类的方法时,不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是,可以抛出更少、更有限或者不抛出异常。例如,如果父类方法抛出 `Exception`,子类可以抛出 `IOException`,因为 `...

    C#中子类重写父类的方法

    本文将深入探讨C#中子类如何重写父类的方法,以及这种方法在实际编程中的应用。 ### 1. 继承的概念 在C#中,继承是通过使用`:`运算符实现的。一个类(子类)可以通过继承另一个类(父类)来获得其所有非私有的成员...

    java 子类对象赋值给父类对象的使用

    1. **方法覆盖**:当子类继承父类并重写父类中的方法时,通过父类引用调用该方法,将执行子类中的版本。这是多态性的一种体现。 2. **构造器与初始化**:子类对象在创建时会先调用父类的构造器,确保父类的状态得到...

    Java中关于子类覆盖父类的抛出异常问题

    通常,我们说子类覆盖父类方法时,抛出的异常不能比父类更"宽泛",这里的"宽泛"指的是异常类型的继承关系。 首先,让我们澄清一下Java中的异常处理概念。Java异常是通过`try-catch-finally`块来管理的,异常是程序...

    c++中子类对象不能调用父类中的虚函数

    然而,有一个重要的概念是:子类对象不能直接调用父类中的虚函数。下面我们将深入探讨这些知识点。 首先,让我们了解`指针`和`引用`。在C++中,`指针`是一个变量,它存储了另一个变量的地址。通过指针,我们可以...

    java中子类继承父类,程序运行顺序的深入分析

    本文将深入分析Java中子类继承父类时的程序运行顺序,这对于理解面向对象编程的执行机制至关重要。 首先,我们需要明确Java程序的执行流程。当一个类被加载时,会按照以下顺序执行: 1. **静态变量初始化**:首先...

    Java中子类调用父类构造方法的问题分析

    本篇文章介绍了,Java中子类调用父类构造方法的问题分析。需要的朋友参考下

    C#中子类调用父类的实现方法

    总结,C#中子类调用父类的方法主要通过构造函数调用和直接访问公共属性实现。在子类构造函数中使用`base`关键字可以指定调用父类的特定构造函数,而父类的公共属性可以直接在子类中被读取和修改。这种机制对于代码...

    python中子类调用父类函数的方法示例

    然而,在某些情况下,子类可能需要调用父类的特定函数,特别是当子类重写了父类的方法,但仍然希望在子类中保留父类的原始行为时。本篇文章将详细介绍如何在Python中实现子类调用父类函数。 首先,Python中的初始化...

    PHP中子类重载父类的方法【parent::方法名】

    单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写。 子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承...

    Java序列化中子类、父类构造函数问题实例分析

    Java序列化中子类、父类构造函数问题实例分析 本文主要介绍了Java序列化中子类、父类构造函数问题,结合实例形式分析了java父类与子类构造函数中序列化接口调用相关操作技巧与使用注意事项。 一、序列化接口的实现...

    ChildClass.java

    java中子类强转父类,实际上依然是子类; 该引用只能调用父类中定义的方法和变量; 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; ## Java 父类强转子类 ...

    Java中子类.pdf

    在Java中,子类的概念是通过继承父类来实现的,它允许开发者创建一个新类,这个新类继承了另一个类的属性和方法,同时还能加入新的功能或覆盖旧的实现。 当我们提及Java中的子类时,我们实际上是在讨论一种特殊的类...

    子类调用抽象父类.zip

    当我们创建一个子类并继承了抽象父类时,如果父类中存在抽象方法,那么子类必须重写这些方法,提供具体的实现,否则子类也将被视为抽象类。这是编程语言强制子类对抽象父类行为进行具体化的手段,确保每个实例化的...

    Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍

    Java 和 C++ 在子类覆盖父类函数时的可访问性缩小有显著的不同。首先,我们要理解什么是函数覆盖。在面向对象编程中,子类可以重写或覆盖父类的方法,以便实现自己的行为。在 Java 和 C++ 中,这个过程通常是通过...

    Java中子类和父类之间的调用关系

    - `super`关键字则用于引用父类的对象,主要用于调用父类的成员变量或方法,尤其是当子类重写了父类的方法时,`super`可以调用父类的原版方法。在构造器中,`super()`用于调用父类的构造器。 3. **继承关系**: -...

    python中子类继承父类的__init__方法实例

    前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上运行。...子类不重写__init__ , 实例化子类时,会自动调用父类定义的__init

Global site tag (gtag.js) - Google Analytics