Почему 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 ();
}
}
Я не вижу какой-либо конкретной проблемы с вышеупомянутым подходом - это только как "грязный/сложный", поскольку уже допустимое скрытие статики уже есть.
Ответы
Ответ 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