Java中的重写方法约束

天界:

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。我的理解正确吗?我是否还有其他更相关的东西?

Kerrek SB:

通过说“子类必须表现得好像是超类”来概括所有这些。因此,如果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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章