将参数作为Wrapper类传递并覆盖

时间:2014-08-25 06:00:11

标签: java

请澄清我对覆盖的疑问,当我调用一个未被覆盖的方法时,被调用的方法是父类,请对此进行简要说明,例如:

   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类中,该方法将包装类作为参数。

3 个答案:

答案 0 :(得分:3)

有两种方法。一个接受int和其他接受Integer类型。因此,当您首先调用test()方法时,它会尝试在不执行任何autoboxing的情况下找到合适的方法。在这种情况下,它可以找到接受int的父类test()方法。因此java将执行该操作。

如果它不存在,那么它将尝试autobox您的参数并检查是否有合适的方法。在这种情况下,您的子类方法将被执行。

编辑 Java将始终为类型选择最具体的方法。仅在必要时进行铸造/自动装箱/拆箱。

如果您想调用子类方法,可以尝试

a.test(new Integer(2));

答案 1 :(得分:0)

在这种情况下overriding没有发生。因为overloading调用它时会将方法accept输入参数称为int

答案 2 :(得分:0)

编译允许您在基元和包装器之间自动装箱和取消装箱,但这并不能使其成为另一个的子类。 intInteger是两种不同的类型,因此当它们在方法中使用时,它们都是两种不同的方法(如您的情况)

请参阅以下链接以获得更清晰的解释 int does not override Integer in Java