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

父类的Java动态绑定调用方法,java,inheritance,overriding,Java,Inheritance,Overriding,下面是我试图分析的代码 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); } } 但在调试时,父类的方法正在被调用。但根据我的理解,它应该动

下面是我试图分析的代码

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);
    }
}

但在调试时,父类的方法正在被调用。但根据我的理解,它应该动态地调用Back的方法。请帮助我理解这种行为。现在再次说明,如果我将父类参数保持为
List
,子类参数保持为
List
,那么它会给出一个名称冲突的东西。在这种情况下为什么不呢?

parent类方法
public void-aMethod(列表A)
,子类方法是
public void-aMethod(字符串A)

两者都有不同的参数,因此它不是方法重写。然而,在子类中,它可以被认为是方法重载

调用该方法时,传递的是
list
参数,并且只有与此签名匹配的方法是父类。因此父类的方法被调用

方法重写 对于方法,基类和子类中的重写方法必须具有相同的签名,即相同的名称和参数。然而,子类中的方法可以比基类的方法具有更高的作用域访问说明符


简单地说,如果基类中的方法是
default
,那么子类中的方法可以是
public

父类方法
public void aMethod(列表A)
,子类方法是
public void aMethod(字符串A)

两者都有不同的参数,因此它不是方法重写。然而,在子类中,它可以被认为是方法重载

调用该方法时,传递的是
list
参数,并且只有与此签名匹配的方法是父类。因此父类的方法被调用

方法重写 对于方法,基类和子类中的重写方法必须具有相同的签名,即相同的名称和参数。然而,子类中的方法可以比基类的方法具有更高的作用域访问说明符


简单地说,如果基类中的方法是
default
,则子类中的方法可以是
public

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

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

返回类型应与在超类的原始重写方法中声明的返回类型相同或是其子类型

访问级别不能比重写方法的访问级别更严格。例如:如果超类方法声明为public,则子类中的重写方法不能是private或protected

仅当实例方法由子类继承时,才可以重写它们

无法重写声明为final的方法

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

如果无法继承方法,则无法重写该方法

与实例的超类位于同一包中的子类可以重写任何未声明为private或final的超类方法

不同包中的子类只能重写声明为public或protected的非final方法

重写方法可以抛出任何未选中的异常,而不管被重写的方法是否抛出异常。但是,重写方法不应抛出新的或比重写方法声明的范围更广的已检查异常。重写方法可以抛出比重写方法更窄或更少的异常


如果您选中此项,然后编写代码,就可以清楚地知道错误在哪里。

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

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

返回类型应与在超类的原始重写方法中声明的返回类型相同或是其子类型

访问级别不能比重写方法的访问级别更严格。例如:如果超类方法声明为public,则子类中的重写方法不能是private或protected

仅当实例方法由子类继承时,才可以重写它们

无法重写声明为final的方法

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

如果无法继承方法,则无法重写该方法

与实例的超类位于同一包中的子类可以重写任何未声明为private或final的超类方法

不同包中的子类只能重写声明为public或protected的非final方法

重写方法可以抛出任何未选中的异常,而不管被重写的方法是否抛出异常。但是,重写方法不应抛出新的或比重写方法声明的范围更广的已检查异常。重写方法可以抛出比重写方法更窄或更少的异常


如果您选中此项,然后编写代码,就可以清楚地知道错误在哪里。

当方法的签名不同时,您不会覆盖父方法!那么为什么在后面提到的案例中会出现编译问题呢?它与泛型的类型擦除有关,在运行时,这两个方法都被视为
aMethod(List List)
当方法的签名不同时,您不会覆盖父方法!那么为什么在后面提到的案例中会出现编译问题呢?它与泛型的类型擦除有关,在运行时,这两种方法都被视为
aMethod(列表)
方法必须具有相同的签名=相同的名称和相同的参数。为什么在后面提到的案例中会出现编译问题?@Nilesh,因为编译器不介意在
Acc a = new Back();
a.aMethod(list);