Java中的重写方法具有以下功能:
1> Overrinding方法应具有与Parent类方法相同的参数列表。
2>返回类型应与父类方法的返回类型相同/子类。
3>访问级别应与父类方法相同或更少限制。
4>覆盖的方法可以引发相同或更窄的异常,而不是更广泛的异常。
* 只是想知道为什么如此*
* 2-为什么子类为什么不超类?*
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。我的理解正确吗?我是否还有其他更相关的东西?
通过说“子类必须表现得好像是超类”来概括所有这些。因此,如果Derived
扩展Base
并且我有一个x
类型的对象Derived
,那么我希望它的行为就像它是类型的一样Base
。
因此,如果x.foo()
返回某个类型T
,并Base::foo()
返回一个类型S
,那么我希望能够将其x.foo()
视为S
,因此T
最好与或相同S
。
同样,x.foo()
应仅抛出Base:foo()
应允的异常。它无法开始引发新的意外异常。
如果Base::foo()
是公开的,那么应该是公开的x.foo()
。您不能突然对派生类施加更严格的限制,因为基类向我保证它是公共的。
始终将继承视为“行为类似于超类”或“可以被视为超类”,所有这些都应该清楚。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句