以下是我要分析的代码。
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);
但是在调试时,正在调用父类的方法。但是根据我的理解它应该动态调用Back的方法。请帮助我理解这个行为。现在再次如果我将父类参数保持为List<Integer>
和孩子一样List<String>
然后它给出了一个名字冲突的东西。为什么不在这种情况下?
答案 0 :(得分:4)
父类方法public void aMethod(List<Integer> A)
和子类方法是public void aMethod(String A)
。
两者都有不同的参数,因此它不是Method Overriding
。但是在儿童课程中,可以将其视为Method Overloading
。
当您调用该方法时,您将传递list
参数,并且只有与此签名匹配且与父类相匹配的方法。所以父类的方法被调用。
对于基类中的方法重写方法,子类必须具有相同的签名,即相同的名称和相同的参数。但是,子类中的方法可以具有比基类方法更高的范围访问说明符。
简单来说,如果基类中的方法是default
,那么子类中的方法可以是public
。
答案 1 :(得分:0)
以下是方法覆盖的一些规则:
参数列表应与重写方法完全相同。
返回类型应该是超类中原始重写方法中声明的返回类型的相同或子类型。
访问级别不能比重写方法的访问级别更具限制性。例如:如果超类方法被声明为public,则子类中的重写方法不能是私有的或受保护的。
实例方法只有在子类继承时才能被覆盖。
无法覆盖声明为final的方法。
声明为static的方法不能被覆盖,但可以重新声明。
如果某个方法无法继承,则无法覆盖该方法。
与实例的超类在同一个包中的子类可以覆盖任何未声明为private或final的超类方法。
另一个包中的子类只能覆盖声明为public或protected的非final方法。
重写方法可以抛出任何uncheck异常,无论被覆盖的方法是否抛出异常。但是,重写方法不应抛出新的或更宽的已检查异常,而不是重写方法声明的异常。覆盖方法可以抛出比重写方法更窄或更少的异常。
如果你检查这个,然后编写代码,就会清楚它的错误。