Java 是否可以重写超类和…; 更改访问修饰符 从公共到私人 从私人到公共 更改throw子句 更多例外 更少的例外 更改返回类型 子类型 超级类型

Java 是否可以重写超类和…; 更改访问修饰符 从公共到私人 从私人到公共 更改throw子句 更多例外 更少的例外 更改返回类型 子类型 超级类型,java,Java,有人能解释一下吗?这里有一些凌驾规则: 更改访问修饰符 你不能降低能见度 因为在运行时,由于可见性下降,无法访问子类的重载方法时,它会破坏整个过程 假设该方法在超类中是公共的,并且您在子类中重写时将其更改为私有的,但由于您有一个超类的引用,所以编译器不会抱怨,但在运行时它会崩溃 更改抛出子句 您不能抛出较新的选中异常或更广泛的异常 同样的事情也适用于这里,因为编译器寻找用于抛出的超类方法,但如果在运行时子类抛出新的或更广泛的异常,那么谁负责处理所有应在编译时捕获的新检查异常 更改退货类型 仅支

有人能解释一下吗?

这里有一些凌驾规则:

  • 更改访问修饰符

    你不能降低能见度

    因为在运行时,由于可见性下降,无法访问子类的重载方法时,它会破坏整个过程

    假设该方法在超类中是公共的,并且您在子类中重写时将其更改为私有的,但由于您有一个超类的引用,所以编译器不会抱怨,但在运行时它会崩溃

  • 更改抛出子句

    您不能抛出较新的选中异常或更广泛的异常

    同样的事情也适用于这里,因为编译器寻找用于抛出的超类方法,但如果在运行时子类抛出新的或更广泛的异常,那么谁负责处理所有应在编译时捕获的新检查异常

  • 更改退货类型

    仅支持

    注意:协变返回类型,意味着允许返回类型在与子类相同的方向上变化


这是一篇简洁的小文章(),讨论了重写方法及其一些规则。这很有帮助,你应该看看。一些规则如下:

•在java中,方法只能在子类中编写,不能在同一类中编写

•参数列表应与 重写的方法

•返回类型应相同或为 在中的原始重写方法中声明的返回类型 超级级

•访问级别不能比 重写方法的访问级别。例如:如果超类 方法声明为public,然后在子类中重写方法 不能是私有的或受保护的

•实例方法可以是 仅当它们被子类继承时才重写

•一种方法 无法重写已声明的final

•不能使用声明为静态的方法 可以重写,但可以重新声明

•如果无法继承某个方法 那么它就不能被覆盖

•同一软件包中的子类 实例的超类可以覆盖任何可用的超类方法 未被宣布为私有或最终的

•不同包中的子类可以 仅重写声明为public或protected的非final方法

•一个 重写方法可以抛出任何未选中的异常,无论 重写的方法是否引发异常。然而 重写方法不应抛出新的或已检查的异常 比重写方法声明的范围更广。这个 重写方法可以抛出比 重写的方法

•不能覆盖构造函数


这里还有Oracle关于重写方法的官方文章:

几乎所有这些更改都与所谓的(其中一个)相关。这一原则基本上表明,当您与类型的实例交互时,您的超类/接口在本例中,所有子类型/实现者必须至少公开该接口,理想情况下,也必须以通常相同的方式进行操作

  • 子类只能重写它继承的实例方法。由于私有方法和final方法不是继承的,因此不能重写它们

  • 重写方法的返回类型应与重写超类方法中声明的返回类型相同,或是其子类

  • 重写方法的参数列表应与重写超类方法的参数列表相同。这一点很重要,因为不同的参数列表会导致重载而不是重写

  • 重写方法的访问修饰符应与超类方法的访问修饰符相同或限制性更小。它再严格不过了

  • 重写方法不能抛出新的异常或比重写的超类方法声明的异常范围更广的异常。然而,它可以抛出比超类方法更窄或更少的异常

  • 不能重写静态方法


重写中更改签名的经验法则是,如果对父项的有效调用不是对子项的有效调用,则不允许您这样做

在您描述的场景中:

  • 从public到private您将完全从public API中删除该方法,这肯定会破坏调用方
  • 从private到publicYES,因为您现在允许更多的调用者调用该方法(但不禁止任何以前的调用者)。对于可见性的任何增加都是如此(
    private
    默认为
    protected
    默认为
    public
  • 更多异常NONO,因为调用方需要捕获更多异常
  • 更少的异常,因为允许调用方捕获永远不会抛出的异常
  • 对于子类型YESYES,因为子类型的每个实例也是超类型的实例。调用方返回的返回值将是预期类型的实例
  • 到超级类型NONO,因为调用者需要一个子类型的实例,而您可以返回另一个子类型的实例
您可以做的其他事情包括:

  • 将参数的类型更改为超类型,因为