覆盖java中的方法约束

Dev*_*eva 5 java overriding

在Java中重写方法具有以下功能:

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

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

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

4> overriden方法可以抛出相同或更窄的异常,而不是更广泛的异常.

*只是想知道为什么这么点*

*2 - 为什么子类为什么不是超类呢?*

3 - 为什么访问级别应该限制较少?

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

根据我的理解它只是如果我创建一个父类refrence创建一个子类对象并尝试运行每个方案然后

让我们假设A是父类,B是子类,它们都有方法printAndReturnSomething()

public class A{

       public B printAndReturnSomething(){
                S.O.P("Inside A Print");
                return new B();
              }
}
Run Code Online (Sandbox Code Playgroud)

现在我们将子类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();
              }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我做这样的事情

A a =new B();
Run Code Online (Sandbox Code Playgroud)

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

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

Similaraly为场景3和4.我的理解是否正确?我错过了其他更相关的东西吗?

Ker*_* SB 5

所有这些都可以通过说"子类必须表现得好像它是一个超类"来概括.所以,如果Derived延伸Base和我有一个对象x类型的Derived,那么我希望它表现得完全就像它是类型Base.

因此,如果x.foo()返回某种类型T,并Base::foo()返回一个类型S,那么我希望能够将其x.foo()视为一个S,因此T最好与它的子类相同S.

同样,x.foo()应该只抛出Base:foo()承诺的异常.它无法开始抛出新的意外异常.

如果Base::foo()是公开的,那么应该x.foo()如此.你不能突然对派生类有更严格的限制,因为基类承诺我是公开的.

总是将继承视为"表现得像超级类",或"可以像超类一样对待",所有这一切都应该清楚.


gna*_*nat 5

根据我的理解,如果我正在创建父类引用以创建子类对象并尝试运行每种情况,那么...

我认为您正确理解了这个想法。

案例与父类引用子类对象就是所谓的里氏替换原则发挥作用:在计算机程序中,如果S是T的子类型,那么类型的对象牛逼 [这是你的“父类”] 可能与类型的对象替换S [即您的“子类对象”] (即类型S的对象可以替代类型T的对象),而无需更改该程序的任何所需属性(正确性,执行的任务等)...