为什么要打印整数? 在编译时,方法调用绑定到类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);
}
}
答案 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 method
,A
:
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)
。
如果您要将引用声明为B
,method(int)
将更适合您的参数,并且会被调用。