请澄清我对覆盖的疑问,当我调用一个未被覆盖的方法时,被调用的方法是父类,请对此进行简要说明,例如:
public class A {
public void test(int x){
System.out.println("Haiiiiiii");
}
}
public class B extends A{
public void test(Integer x){
System.out.println("hiii Im b's method");
}
}
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
B a=new B();
a.test(2);
}
}
我正在调用b的方法,但在B类中,该方法将包装类作为参数。
答案 0 :(得分:3)
有两种方法。一个接受int
和其他接受Integer
类型。因此,当您首先调用test()
方法时,它会尝试在不执行任何autoboxing
的情况下找到合适的方法。在这种情况下,它可以找到接受int的父类test()
方法。因此java将执行该操作。
如果它不存在,那么它将尝试autobox
您的参数并检查是否有合适的方法。在这种情况下,您的子类方法将被执行。
编辑 Java将始终为类型选择最具体的方法。仅在必要时进行铸造/自动装箱/拆箱。
如果您想调用子类方法,可以尝试
a.test(new Integer(2));
答案 1 :(得分:0)
在这种情况下overriding
没有发生。因为overloading
调用它时会将方法accept输入参数称为int
。
答案 2 :(得分:0)
编译允许您在基元和包装器之间自动装箱和取消装箱,但这并不能使其成为另一个的子类。 int
和Integer
是两种不同的类型,因此当它们在方法中使用时,它们都是两种不同的方法(如您的情况)
请参阅以下链接以获得更清晰的解释 int does not override Integer in Java