Overriding and Overloading is a way to achieve Polymorphism in OOP. It is one of the most common and important questions which is asked in many interview and competitive exams. Let’s understand what is the meaning of these terms overriding, overloading and static method. At the end of this discussion, one will get to know whether function overriding and function overloading is feasible on a static method or not.
If more than one method of a class (be it in the same class or inherited by another class) have the same name but they differ in their method signatures, then the methods are said to be overloaded. Consider the example given below
class A {
public void read(int a) {
System.out.println("I am in class A");
System.out.println(a);
}
}
class B extends A {
public void read(int a, int b) {
System.out.println("I am in class B");
System.out.println(a);
System.out.println(b);
}
}
public class test {
public static void main(String[] args) {
B obj = new B();
obj.read(10);
obj.read(20, 30);
}
}Output
I am in class A
10
I am in class B
20
30As we created the object of class B and passed a single argument in the function read, then the method which accepted only a single argument gets executed i.e. method in class A but when we passed two arguments in the read method then the method in class B gets executed as it accepts two arguments in its parameters.
It is decided at the compile-time only by the compiler that which method is going to be executed according to the number of arguments that are being passed to a method. Hence overloading is used to implement compile-time polymorphism.
If two or more methods which have the same name and same method signature are declared in different classes to implement some specific feature then we say that those methods are overridden. Overriding is used for implementing run-time polymorphism. Understand this with the given example
class A {
public void read(int a) {
System.out.println("I am in class A");
System.out.println(a);
}
}
class B extends A {
public void read(int a) {
System.out.println("I am in class B");
System.out.println(a);
}
}
public class test {
public static void main(String[] args) {
B obj = new B();
obj.read(10);
}
}Output
I am in class B
10Since class B extends class A and the read method of class A is available to it, still the preference is given to the read method that is present in class B and is executed. Here the method read in class A has been overridden by class B.
It is decided at the runtime that which function is going to be executed according to the object that is being created for calling the methods. If the object of the parent class is being used for calling, then the read method of the parent class is executed and if the object of child class is being used for calling, then the read method of child class gets executed.
The answer is NO. We cannot override a static method in Java. Understand this with the help of an example given below
class car {
public static void start() {
System.out.println("Car starts");
}
public void stop() {
System.out.println("Car stops");
}
public void refuel() {
System.out.println("Car refuels");
}
}
public class honda extends car {
public static void start() {
System.out.println("Honda starts");
}
}
public class test {
public static void main(String[] args) {
honda h = new honda();
h.start();
h.stop();
h.refuel();
}
}Output:
Honda starts
Car stops
Car refuelsIf you try to access the h.start() function, first it will give a warning because the static method will be stored at a common memory allocation in java memory and if we try to access the h.start() with object reference type it will give us a warning because the static method will never be stored inside the object. Hence it is preferred to call a static method with the help of class rather than calling it with an object. The above code will give the output Honda starts i.e. h.start() function of child class will be executed because we called the function with the help of the object of class B. If we would have called it with the help of the object of class A then start function of class A would have been executed.
Static methods are stored at a common memory allocation in Java memory and if we try to access the h.start(), which is basically a static function, with object reference type it will give us a warning because the static methods are never stored inside the object. Hence it is preferred to call a static method with the help of class rather than calling it with an object.
The above code will give the output Honda starts i.e. h.start() function of child class will be executed because we called the function with the help of the object of class honda. If we would have called it with the help of the object of class car then start function of class car would have been executed.
start function of the class car (parent class) with the help of the class honda (child class). It is called method hiding in Java i.e. static function start in class car is hidden.Now we know that a static function cannot be overridden but what about overloading? The answer is YES. Static methods can be overloaded in Java without any errors. For example
class A {
public static void read(int a) {
System.out.println("I am in class A");
System.out.println(a);
}
}
class B extends A {
public static void read(int a, int b) {
System.out.println("I am in class B");
System.out.println(a);
System.out.println(b);
}
}
public class test {
public static void main(String[] args) {
B obj = new B();
obj.read(10);
obj.read(20, 30);
}
}Output:
I am in class A
10
I am in class B
20
30The above code gets executed without any error and hence we can say that static methods can be overloaded.
The answer is NO. The compiler will raise an error if we try to overload a static function which differs only in the static keyword. Consider the below example
class A {
public void read(int a) {
System.out.println("I am in class A");
System.out.println(a);
}
public static void read(int a) {
System.out.println("I am in class B");
System.out.println(a);
}
public static void main(String[] args) {
A.read(10);
}
}Output
error: method read(int) is already defined in class A
error: non-static method read(int) cannot be referenced from a static contextThe above code will show an error at the time of compilation which shows that the static method which differs only in static keyword is not overloaded.
With this, we end our topic and we hope that the concept of overriding and overloading with static methods is clear to you.
Help us improve this content by editing this page on GitHub