为什么它打印整数

时间:2016-02-05 09:21:02

标签: java

为什么要打印整数? 在编译时,方法调用绑定到类A的方法。 我希望在B中我不会压倒一切。创建另一个方法意味着使用不同的类重载方法。 但是在运行时发生了什么?

class A{

void method(Integer i)
{
    System.out.println("Integer");

}
}
class B extends A
{

void method(int i)
{
    System.out.println("Int");
}  
}
public class Puzzle{
    public static void main(String ar[]){
        A a = new B();
        a.method(20);
    }
}

6 个答案:

答案 0 :(得分:3)

B有两个名为method的不同方法:一个由A声明,一个是method(Integer),另一个是B声明的,method(int) 1}}。

由于您的变量a的类型为A,因此对a.method()的调用必须引用类A提供的方法method(Integer)

答案 1 :(得分:1)

您的方法不共享相同的签名。 void method(int i) 与<{1}}不等 - 第一个使用基本类型。第二个使用Object Integer。

如果您将A中的方法更改为方法(int i),则可以void method(Integer i) override the methodA

in your subclass

答案 2 :(得分:1)

B不会覆盖名为&#34;方法&#34;的方法。因为它与A(整数)中方法的参数类型不同。

int是基本类型,而Integer是类。

B方法应该是:

@Override
void method(Integer i)
{
    System.out.println("Int");
}  

注释@Override在这里告诉类应该覆盖一个方法。这是一个很好的做法,但没有必要(没有它我会工作)。如果你把它与当前代码一起使用,你就会出错,因为方法不会覆盖任何方法。

我希望它会对你有所帮助。

答案 3 :(得分:0)

这正是@Override注释的用途 - 当您认为自己重写时添加@Override,编译器会在您这么做时告诉您是否错误。

如果您将@Override添加到B method(int i),编译器会向您发出错误消息,告诉您实际上并未覆盖它,因为签名不同 - 即该方法具有不同的参数类型,而不是父类参数类型的超类。

答案 4 :(得分:0)

A方法和B方法的签名不一样。 A中的方法将对象整数(Integer)作为参数,而B的方法将原始整数(int)作为参数。所以你并没有真正重写B中的A方法。为此,将方法B的签名更改为A的签名。

class A{

   void method(Integer i){
      System.out.println("Integer");
   }

}

class B extends A{

   @Override
   void method(Integer i){
       System.out.println("Int");
   }  

}

public class Puzzle{
   public static void main(String[] args){
      A a = new B();
      a.method(20);
   }
}

答案 5 :(得分:0)

您的引用类型为A - 它无法识别在编译时在类型B中声明的方法,即使它可能存在于运行时中。然后,int文字20会自动退回到java.lang.Integer,并调用method(Integer)

如果您要将引用声明为Bmethod(int)将更适合您的参数,并且会被调用。