问题
I've been reading a section on Statics in the SCJP study guide, and it mentions the following :
static methods can't be overridden, but they can be redefined
What does redefining actually mean? Is it a case of having a static method that exists in both parent and child, with the same signature, however they are referenced separately by their class names? Such as :
class Parent
{
static void doSomething(String s){};
}
class Child extends Parent
{
static void doSomething(String s){};
}
Referenced as : Parent.doSomething();
and Child.doSomething();
?
Also, does the same apply for static variables, or just static methods?
回答1:
It simply means that the functions are not virtual. As an example, say that you have an object of (runtime) type Child which is referenced from a variable of type Parent. Then if you invoke doSomething
, the doSomething
method of the Parent is invoked:
Parent p = new Child();
p.doSomething(); //Invokes Parent.doSomething
If the methods were non-static, doSomething
of Child would override that of Parent and child.doSomething
would have been invoked.
The same holds for static fields.
回答2:
Static means there is one per class, rather than one per object. This is true for both methods and variables.
A static field would imply that there is one such field, no matter how many objects of that class are created. Please take a look at Is there a way to override class variables in Java? for the question of overriding a static field. In short: a static field cannot be overridden.
Consider this:
public class Parent {
static int key = 3;
public void getKey() {
System.out.println("I am in " + this.getClass() + " and my key is " + key);
}
}
public class Child extends Parent {
static int key = 33;
public static void main(String[] args) {
Parent x = new Parent();
x.getKey();
Child y = new Child();
y.getKey();
Parent z = new Child();
z.getKey();
}
}
I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 3
I am in class tools.Child and my key is 3
Key never comes back as 33. However, if you override getKey and add this to Child, then the results will be different.
@Override public void getKey() {
System.out.println("I am in " + this.getClass() + " and my key is " + key);
}
I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 33
I am in class tools.Child and my key is 33
By overriding the getKey method, you are able to access the Child's static key.
回答3:
In rajah9's answer if now we make the two methods static both in parent and child:
public static void getKey() {
System.out.println("I am in and my key is " + key);
}
Two things to note now: Can't use 'this.getClass()' and warning 'The static method getKey() from the type Parent should be accessed in a static way' also
Parent z = new Child();
z.getKey();
Will give the output
I am in class tools.Parent and my key is 3
instead of
I am in class tools.Parent and my key is 33
来源:https://stackoverflow.com/questions/6609842/what-does-redefining-static-methods-mean-in-java