Why doesn't the compiler complain when I try t

2019-01-06 14:12发布

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?

8条回答
劳资没心,怎么记你
2楼-- · 2019-01-06 14:20

Static methods will called by its Class name so we don't need to create class object we just cal it with class name so we can't override static

for example

class AClass{
public static void test(){

 } 
}

class BClass extends AClass{
public static void test(){}

}

class CClass extends BClass{
public static void main(String args[]){

AClass aclass=new AClass();

aclass.test(); // its wrong because static method is called 
               // by its class name it can't accept object
}
}

we just call it

AClass.test();

means static class can't be overridden if it's overridden then how to cal it .

查看更多
唯我独甜
3楼-- · 2019-01-06 14:28

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

static are related to class not the state of Object

查看更多
Ridiculous、
4楼-- · 2019-01-06 14:31

Also, the choice of method to call depends on the declared type of the variable.

B b = null;
b.a(); // (1) prints B.a()
A a = new B();
a.a(); // (2) prints a.a() 

At (1), if the system cared about the identity of b, it would throw a NPE. and at (2), the value of a is ignored. Since a is declared as an A, A.a() is called.

查看更多
爱情/是我丢掉的垃圾
5楼-- · 2019-01-06 14:31

While goblinjuice answer was accepted, I thought the example code could improved:

public class StaticTest {
    public static void main(String[] args) {
        A.print();
        B.print();
        System.out.println("-");

        A a = new A();
        B b = new B();
        a.print();
        b.print();
        System.out.println("-");

        A c = b;
        c.print();
    }
}

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

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

Produces:

A
B
-
A
B
-
A

If B had overridden print() it would have write B on the final line.

查看更多
forever°为你锁心
6楼-- · 2019-01-06 14:34

Your method is not overridden method. you just try to put @Override annotation before your method in derived class. it will give you a compile time error. so java will not allow you to override static method.

查看更多
太酷不给撩
7楼-- · 2019-01-06 14:35

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.

查看更多
登录 后发表回答