Java 是否可以重写超类和…; 更改访问修饰符 从公共到私人 从私人到公共 更改throw子句 更多例外 更少的例外 更改返回类型 子类型 超级类型
有人能解释一下吗?这里有一些凌驾规则:Java 是否可以重写超类和…; 更改访问修饰符 从公共到私人 从私人到公共 更改throw子句 更多例外 更少的例外 更改返回类型 子类型 超级类型,java,Java,有人能解释一下吗?这里有一些凌驾规则: 更改访问修饰符 你不能降低能见度 因为在运行时,由于可见性下降,无法访问子类的重载方法时,它会破坏整个过程 假设该方法在超类中是公共的,并且您在子类中重写时将其更改为私有的,但由于您有一个超类的引用,所以编译器不会抱怨,但在运行时它会崩溃 更改抛出子句 您不能抛出较新的选中异常或更广泛的异常 同样的事情也适用于这里,因为编译器寻找用于抛出的超类方法,但如果在运行时子类抛出新的或更广泛的异常,那么谁负责处理所有应在编译时捕获的新检查异常 更改退货类型 仅支
- 更改访问修饰符 你不能降低能见度 因为在运行时,由于可见性下降,无法访问子类的重载方法时,它会破坏整个过程 假设该方法在超类中是公共的,并且您在子类中重写时将其更改为私有的,但由于您有一个超类的引用,所以编译器不会抱怨,但在运行时它会崩溃
- 更改抛出子句 您不能抛出较新的选中异常或更广泛的异常 同样的事情也适用于这里,因为编译器寻找用于抛出的超类方法,但如果在运行时子类抛出新的或更广泛的异常,那么谁负责处理所有应在编译时捕获的新检查异常
- 更改退货类型 仅支持 注意:协变返回类型,意味着允许返回类型在与子类相同的方向上变化
这里还有Oracle关于重写方法的官方文章:几乎所有这些更改都与所谓的(其中一个)相关。这一原则基本上表明,当您与类型的实例交互时,您的超类/接口在本例中,所有子类型/实现者必须至少公开该接口,理想情况下,也必须以通常相同的方式进行操作
- 子类只能重写它继承的实例方法。由于私有方法和final方法不是继承的,因此不能重写它们
- 重写方法的返回类型应与重写超类方法中声明的返回类型相同,或是其子类
- 重写方法的参数列表应与重写超类方法的参数列表相同。这一点很重要,因为不同的参数列表会导致重载而不是重写
- 重写方法的访问修饰符应与超类方法的访问修饰符相同或限制性更小。它再严格不过了
- 重写方法不能抛出新的异常或比重写的超类方法声明的异常范围更广的异常。然而,它可以抛出比超类方法更窄或更少的异常
- 不能重写静态方法
- 从public到private否您将完全从public API中删除该方法,这肯定会破坏调用方
- 从private到publicYES,因为您现在允许更多的调用者调用该方法(但不禁止任何以前的调用者)。对于可见性的任何增加都是如此(
默认为private
默认为protected
)public
- 更多异常NONO,因为调用方需要捕获更多异常
- 更少的异常是,因为允许调用方捕获永远不会抛出的异常
- 对于子类型YESYES,因为子类型的每个实例也是超类型的实例。调用方返回的返回值将是预期类型的实例
- 到超级类型NONO,因为调用者需要一个子类型的实例,而您可以返回另一个子类型的实例
- 将参数的类型更改为超类型,因为