gpt4 book ai didi

java - 重写java中的方法约束

转载 作者:搜寻专家 更新时间:2023-10-31 08:20:55 25 4
gpt4 key购买 nike

Java 中的重写方法具有以下特点:

1> Overrinding 方法应该与父类方法具有相同的参数列表。

2>返回类型应该是父类方法返回类型的相同/子类。

3> 访问级别应与父类方法的限制相同或更少。

4> 覆盖的方法可以抛出相同或更窄的异常,而不是更宽的异常。

*只是想知道为什么会这样*

*2 - 为什么子类而不是父类(super class)?*

3 - 为什么访问级别应该放宽限制?

4 - 为什么它应该抛出窄异常?

根据我的理解,如果我正在创建一个父类引用来创建一个子类对象并尝试运行每个场景,那么

假设A 是父类B 是子类 都有方法printAndReturnSomething()

public class A{

public B printAndReturnSomething(){
S.O.P("Inside A Print");
return new B();
}
}

现在我们有子类 B 作为

public class B extends A{
public A printAndReturnSomething(){ // I know this isn't possible to return A but had it been then
S.O.P("Inside A Print");
return new A();
}
}

现在如果我做这样的事情

A a =new B();

现在因为我有 A 的引用,所以我希望返回类型是 B 类型

B returnedValue=a.printAndReturnSomething(); // But it actually calls the child class method and hence returns A. So here comes the contradiction.

对于场景 3 和 4 类似。我的理解是否正确?我错过了其他更相关的东西吗?

最佳答案

所有这一切都可以用“子类的行为必须像父类(super class)一样”来概括。因此,如果 Derived 扩展 Base 并且我有一个类型为 Derived 的对象 x,那么我希望它的行为完全正确就好像它是 Base 类型一样。

因此,如果 x.foo() 返回某种类型 T,而 Base::foo() 返回类型 S ,那么我希望能够将 x.foo() 视为 S,因此 T 最好与或 S 的子类。

类似地,x.foo() 应该只抛出 Base:foo() promise 的异常。它无法开始抛出新的意外异常。

如果 Base::foo() 是公开的,那么 x.foo() 也应该是公开的。你不能突然对派生类有更严格的限制,因为基类向我保证它是公共(public)的。

总是将继承视为“表现得像父类(super class)”,或者“可以像父类(super class)一样对待”,所有这些都应该很清楚。

关于java - 重写java中的方法约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com