Why doesn't Java allow overriding of static methods?

后端 未结 22 2699
谎友^
谎友^ 2020-11-21 05:49

Why is it not possible to override static methods?

If possible, please use an example.

相关标签:
22条回答
  • 2020-11-21 06:21

    In general it doesn't make sense to allow 'overriding' of static methods as there would be no good way to determine which one to call at runtime. Taking the Employee example, if we call RegularEmployee.getBonusMultiplier() - which method is supposed to be executed?

    In the case of Java, one could imagine a language definition where it is possible to 'override' static methods as long as they are called through an object instance. However, all this would do is to re-implement regular class methods, adding redundancy to the language without really adding any benefit.

    0 讨论(0)
  • 2020-11-21 06:21

    A Static method, variable, block or nested class belongs to the entire class rather than an object.

    A Method in Java is used to expose the behaviour of an Object / Class. Here, as the method is static (i.e, static method is used to represent the behaviour of a class only.) changing/ overriding the behaviour of entire class will violate the phenomenon of one of the fundamental pillar of Object oriented programming i.e, high cohesion. (remember a constructor is a special kind of method in Java.)

    High Cohesion - One class should have only one role. For example: A car class should produce only car objects and not bike, trucks, planes etc. But the Car class may have some features(behaviour) that belongs to itself only.

    Therefore, while designing the java programming language. The language designers thought to allow developers to keep some behaviours of a class to itself only by making a method static in nature.


    The below piece code tries to override the static method, but will not encounter any compilation error.

    public class Vehicle {
    static int VIN;
    
    public static int getVehileNumber() {
        return VIN;
    }}
    
    class Car extends Vehicle {
    static int carNumber;
    
    public static int getVehileNumber() {
        return carNumber;
    }}
    

    This is because, here we are not overriding a method but we are just re-declaring it. Java allows re-declaration of a method (static/non-static).

    Removing the static keyword from getVehileNumber() method of Car class will result into compilation error, Since, we are trying to change the functionality of static method which belongs to Vehicle class only.

    Also, If the getVehileNumber() is declared as final then the code will not compile, Since the final keyword restricts the programmer from re-declaring the method.

    public static final int getVehileNumber() {
    return VIN;     }
    

    Overall, this is upto software designers for where to use the static methods. I personally prefer to use static methods to perform some actions without creating any instance of a class. Secondly, to hide the behaviour of a class from outside world.

    0 讨论(0)
  • 2020-11-21 06:21

    Here is a simple explanation. A static method is associated with a class while an instance method is associated with a particular object. Overrides allow calling the different implementation of the overridden methods associated with the particular object. So it is counter-intuitive to override static method which is not even associated with objects but the class itself in the first place. So static methods cannot be overridden based on what object is calling it, it will always be associated with the class where it was created.

    0 讨论(0)
  • 2020-11-21 06:24

    Method overriding is made possible by dynamic dispatching, meaning that the declared type of an object doesn't determine its behavior, but rather its runtime type:

    Animal lassie = new Dog();
    lassie.speak(); // outputs "woof!"
    Animal kermit = new Frog();
    kermit.speak(); // outputs "ribbit!"
    

    Even though both lassie and kermit are declared as objects of type Animal, their behavior (method .speak()) varies because dynamic dispatching will only bind the method call .speak() to an implementation at run time - not at compile time.

    Now, here's where the static keyword starts to make sense: the word "static" is an antonym for "dynamic". So the reason why you can't override static methods is because there is no dynamic dispatching on static members - because static literally means "not dynamic". If they dispatched dynamically (and thus could be overriden) the static keyword just wouldn't make sense anymore.

    0 讨论(0)
  • 2020-11-21 06:24

    What good will it do to override static methods. You cannot call static methods through an instance.

    MyClass.static1()
    MySubClass.static1()   // If you overrode, you have to call it through MySubClass anyway.
    

    EDIT : It appears that through an unfortunate oversight in language design, you can call static methods through an instance. Generally nobody does that. My bad.

    0 讨论(0)
  • 2020-11-21 06:25

    Yes. Practically Java allows overriding static method, and No theoretically if you Override a static method in Java then it will compile and run smoothly but it will lose Polymorphism which is the basic property of Java. You will Read Everywhere that it is not possible to try yourself compiling and running. you will get your answer. e.g. If you Have Class Animal and a static method eat() and you Override that static method in its Subclass lets called it Dog. Then when wherever you Assign a Dog object to an Animal Reference and call eat() according to Java Dog's eat() should have been called but in static Overriding Animals' eat() will Be Called.

    class Animal {
        public static void eat() {
            System.out.println("Animal Eating");
        }
    }
    
    class Dog extends Animal{
        public static void eat() {
            System.out.println("Dog Eating");
        }
    }
    
    class Test {
        public static void main(String args[]) {
           Animal obj= new Dog();//Dog object in animal
           obj.eat(); //should call dog's eat but it didn't
        }
    }
    
    
    Output Animal Eating
    

    According to Polymorphism Principle of Java, the Output Should be Dog Eating.
    But the result was different because to support Polymorphism Java uses Late Binding that means methods are called only at the run-time but not in the case of static methods. In static methods compiler calls methods at the compile time rather than the run-time, so we get methods according to the reference and not according to the object a reference a containing that's why You can say Practically it supports static overring but theoretically, it doesn't.

    0 讨论(0)
提交回复
热议问题