Why doesn't the compiler complain when I try to override a static method?

I know that we cannot override static methods in Java, but can someone explain the following code?

class A {
    public static void a() { 
        System.out.println("A.a()");
    }
}   

class B extends A {
    public static void a() {
        System.out.println("B.a()");
    }
}

How was I able to override method a() in class B ?


You didn't override anything here. To see for yourself, Try putting @Override annotation before public static void a() in class B and Java will throw an error.

You just defined a function in class B called a() , which is distinct (no relation whatsoever) from the function a() in class A .

But Because Ba() has the same name as a function in the parent class, it hides Aa() [As pointed by Eng. Fouad]. At runtime, the compiler uses the actual class of the declared reference to determine which method to run. For example,

B b = new B();
b.a() //prints B.a()

A a = (A)b;
a.a() //print A.a(). Uses the declared reference's class to find the method.

You cannot override static methods in Java. Remember static methods and fields are associated with the class, not with the objects. (Although, in some languages like Smalltalk, this is possible).

I found some good answers here: Why doesn't Java allow overriding of static methods?


That's called hiding a method , as stated in the Java tutorial Overriding and Hiding Methods:

If a subclass defines a class method with the same signature as a class method in the superclass, the method in the subclass hides the one in the superclass.


static methods are not inherited so its B 's separate copy of method

static are related to class not the state of Object

链接地址: http://www.djcxy.com/p/4116.html

上一篇: Python在类中有“私有”变量吗?

下一篇: 为什么当我尝试重写静态方法时编译器不会抱怨?