Статика и переопределение в Java - PullRequest
3 голосов
/ 17 июня 2010

public class B {

    static int i =1;

    public static int multiply(int a,int b)
    {
        return i;
    }

    public int multiply1(int a,int b)
    {
        return i;
    }

    public static void main(String args[])
    {
        B b = new A();
        System.out.println(b.multiply(5,2));
        System.out.println(b.multiply1(5,2));
    }
}

class A extends B
{
    static int i =8;

    public static int multiply(int a,int b)
    {
        return 5*i;
    }

    public int multiply1(int a,int b)
    {
        return 5*i;
    }

}

Выход:

1

40

Почему это так? Пожалуйста, объясните.

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

Вы не можете переопределить static методы - они статически связаны с классом, в котором они определены. Таким образом, в отличие от методов экземпляра, они вообще не полиморфны.

Фактически, b.multiply(5,2) должно приводить к предупреждению компилятора о том, что вызовы метода static должны ограничиваться классом, а не экземпляром, поэтому правильная форма будет B.multiply(5,2) (или A.multiply(5,2)). Затем выясняется, какой метод на самом деле вызывается.

Если вы пропустите предупреждение компилятора, вы легко запутаетесь: -)

2 голосов
/ 17 июня 2010

Вызов статических методов через ссылки - очень плохая идея - это делает код запутанным.

Эти строки:

B b = new A();
System.out.println(b.multiply(5,2));
System.out.println(b.multiply1(5,2));

скомпилированы в это:

B b = new A();
System.out.println(B.multiply(5,2));
System.out.println(B.multiply1(5,2));

Обратите внимание, что вызовы не основаны на b вообще .На самом деле, b может быть нулевым.Привязка выполняется на основе типа времени компиляции b, игнорируя его значение во время выполнения.

Полиморфизм просто не происходит со статическими методами.

0 голосов
/ 17 июня 2010

Поскольку b относится к типу B. Если вы используете Eclipse, вы увидите предупреждение, которое указывает столько же.

Статический метод умножения (int, int) из типа B должен быть доступен статическим способом

...