所以我正在读这本书,作者说“静态成员不参与运行时多态性。你不能覆盖派生类中的静态成员,但你可以重新定义它们。”
这是什么意思?你能举个例子吗?
谢谢。
答案 0 :(得分:4)
如果在子类中重新定义静态成员(方法或变量),则隐藏超类的定义。
public class Super
{
public static void methodA()
{
}
}
public class Sub extends Super
{
public static void methodA()
{
}
}
这里静态methodA
在子类中重新定义,但它不会覆盖超类的methodA
。
致电Sub.methodA
会调用Sub
' methodA
。如果Sub
没有methodA
,则调用Sub.methodA
会调用Super
' methodA
。
答案 1 :(得分:1)
如果在子类中重新定义静态方法,则其调用方法隐藏。静态方法在编译时而不是运行时解析,你可以根据类来调用它们:比如说:
class A {
public static void mymthod() {}
}
class B extends A {
public static void mymthod() {}
}
你打电话给:
A a = new B();
a.mymthod();//resolved at compile time and associated with class A (compiler will warn although as static method doesnt necessarily need an object to call)
答案 2 :(得分:1)
你可以用这个
看看class A {
static int x = 1;
int y = 1;
int f() {
return 1;
}
static int sf() {
return 1;
}
}
class B extends A {
static int x = 2;
int y = 2;
int f() {
return 2;
}
static int sf() {
return 2;
}
}
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
A b = new B();
System.out.println("A.x=" + ((A) b).x);
System.out.println("B.x=" + b.x);
System.out.println("A.y=" + ((A) b).y);
System.out.println("B.y=" + b.y);
System.out.println("A.f() = " + ((A) b).f());
System.out.println("B.f() = " + b.f());
System.out.println("A.sf() = " + ((A) b).sf());
System.out.println("B.sf() = " + b.sf());
}
}
它pprints:
A.x = 1 B.x = 1 A.y = 1 B.y = 1 A.f()= 2 B.f()= 2 A.sf()= 1 B.sf()= 1
人们会期望B.sf打印为2但不打印。
同样的人会认为B.x和B.y打印为2但也没有,因为字段也不是多态的,只是函数。
我不确定这是否具有很大的实用价值,一定会在完成错误后得知这一点。 这可能会在更糟糕的求职面试中被问到。
答案 3 :(得分:0)
子类中的变量隐藏了超类中具有相同名称的变量。