Подтвердить что ты не робот

Почему Java не позволяет скрывать статические методы методами экземпляра?

Как показано в http://docs.oracle.com/javase/tutorial/java/IandI/override.html, Java разрешает

  • Переопределение метода экземпляра методом экземпляра и
  • Скрытие статического метода статическим методом

Мой вопрос в том, почему Java не позволяет скрывать метод статического суперкласса методом экземпляра. Это можно сделать следующим образом:

class Base {
    static void foo () {}
}

class Derived extends Base {
    void foo () {}
    void access () {
        foo ();
        Base.foo ();
    }
}

Я не вижу какой-либо конкретной проблемы с вышеупомянутым подходом - это только как "грязный/сложный", поскольку уже допустимое скрытие статики уже есть.

4b9b3361

Ответ 1

Я подозреваю, что нужно избегать путаницы с работой с базовым классом. На самом деле я полагаю, что дизайнеры не видели очевидного способа, которым это должно вести себя.

class Base {
    static void foo () {}
}

class Derived extends Base {
    void foo () {} // say this compiled
}

Base b = new Derived()
b.foo(); // should the static or the virtual method be called?

Должен ли b.foo() вызвать Base.foo() или он должен вызвать Derived.foo()?

Ответ 2

Простой ответ: это будет беспорядок.

Конкретный ответ: что вызывать в этом случае Derived.foo()? Base.foo() нельзя вызвать, поскольку он скрыт (согласно вам), Derived.foo() не может быть вызван как не статический.

Ответ 3

Потому что один подобен бананам, а другие - Яблоки.

Explaination:

  • Статические методы создаются при чтении Class-Structure
  • Способы создаются при создании объекта класса.

Пример:

Foo.bar();

- это нечто иное, чем

new Foo().bar();

Угадайте, какой из них называется?

Foo f = new Foo();
f.bar();

Ответ 4

Еще одно дополнение: 1. Статические методы принадлежат классу. Таким образом, вы не можете переопределить метод в производном классе.  как просто его называют сокрытием.:) 2. Методы экземпляра относятся к объектам, поэтому объекты переопределяются. Поэтому мы можем переопределить производный класс.

Выше других комментариев дайте хороший пример, посмотрите на него.

Отношения Punith