Java静态函数
我有一些课Java静态函数,java,function,static,Java,Function,Static,我有一些课 class A{ static void v(){ System.out.println("A"); } } class A1 extends A{ static void v(){ System.out.println("A1"); } } class B <T extends A>{ void v(){ T.v(); } } A类{ 静态void v()
class A{
static void v(){
System.out.println("A");
}
}
class A1 extends A{
static void v(){
System.out.println("A1");
}
}
class B <T extends A>{
void v(){
T.v();
}
}
A类{
静态void v(){
系统输出打印项次(“A”);
}
}
A1类扩展了A类{
静态void v(){
系统输出打印项次(“A1”);
}
}
B类{
void v(){
T.v();
}
}
为什么下面的代码输出“A”
bb=新的B();
b、 v();
我认为代码应该输出“A1”,因为
B()
在Java中不能重写静态方法,只能隐藏它们
阅读以下内容:您的
T.v()
是一个静态的方法调用,并编译成a.v()
,因为T
根据其上限类型擦除a
。很快java不支持覆盖静态方法:
下面是一个可能的副本,更好地解释了这一情况:
静态方法不会动态调度。要调用的确切方法在编译时得到解决,这是由于擦除造成的。这里的问题是,对静态方法的调用在编译时静态绑定到声明的变量类型。在这种情况下,编译器知道T
是A
本地对象的泛型类型是A1
,这并不重要-绑定是在B
内部进行的,其中A
是编译器关于该类型的唯一信息。您没有重写类t的函数v()。因为t是A的子类,调用t.v()的效果等于A.v(),它输出“A”.T扩展了A
为什么它应该输出其他东西?我认为代码应该输出“A1”,因为B()@dr_yand我把它添加到了你的问题中。
B b = new B<A1>();
b.v();