What does redefining static methods mean in Java?
Asked Answered
A

3

12

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?

Alroi answered 7/7, 2011 at 11:25 Comment(0)
N
17

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.

Niklaus answered 7/7, 2011 at 11:32 Comment(0)
F
6

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.

Fieldsman answered 7/7, 2011 at 12:15 Comment(0)
I
0

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
Iover answered 25/3, 2013 at 6:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.