Java父类动态绑定调用方法class

Java dynamic binding calling method of parent class

下面是我要分析的代码。

class Acc{
    public void aMethod(List<Integer> A){
        System.out.println(A.toString());
    }
}

class Back extends Acc{
    public void aMethod(String A){
        System.out.println(A);
    }
}

这里如果我调用它为

Acc a = new Back();
a.aMethod(list);

但是在调试父 class 的方法时 called.But 它应该根据我的 understanding.Please 动态调用 Back 方法帮助我再次理解这个 behaviour.Now如果我将父 class 参数保留为 List<Integer> 并将子参数保留为 List<String> 那么它会给出名称冲突 thing.Why 在这种情况下不是吗?

Parentclass方法public void aMethod(List<Integer> A)和childclass方法是public void aMethod(String A).

两者参数不同,所以不是Method Overriding。但是在 child class 中可以认为是 Method Overloading.

当您调用该方法时,您传递的是 list 参数,并且只有 parent class 的方法匹配此签名。所以 parent class 的方法被调用了。

方法覆盖

对于基础 class 和 child 中的方法覆盖方法,class 必须具有相同的签名,即 相同的名称和相同的参数 。但是 child class 中的方法可以具有比基础 class 方法更高范围的访问说明符。

简而言之,如果基础 class 中的方法是 default 那么 child class 中的方法可以是 public.

以下是方法重写的一些规则:

参数列表应与重写方法的参数列表完全相同。

return 类型应与在 superclass.

中原始重写方法中声明的 return 类型相同或为子类型

访问级别不能比重写方法的访问级别更严格。例如:如果声明了 superclass 方法 public 那么子 class 中的重写方法既不能是私有的也不能是受保护的。

实例方法只有在被子类继承时才能被覆盖class。

无法覆盖声明为 final 的方法。

不能重写声明为静态的方法,但可以重新声明。

如果一个方法不能被继承,那么它就不能被覆盖。

与实例的 superclass 在同一包内的 subclass 可以覆盖任何未声明为 private 或 final 的 superclass 方法。

不同包中的子class只能覆盖声明public或受保护的非最终方法。

覆盖方法可以抛出任何未检查的异常,无论被覆盖的方法是否抛出异常。但是,覆盖方法不应抛出比被覆盖方法声明的异常新的或更广泛的检查异常。覆盖方法可以抛出比被覆盖方法更窄或更少的异常。

如果你检查这个,然后写代码,就很清楚哪里错了。