Почему говорят, что статические методы в JAVA переопределять нельзя, когда их переопределять МОЖНО?
Не ставьте мне, пожалуйста, минусики. Я только начинаю, и вопрос совершенно не глупый. Во всех статьях, что я читала, между переопределением и перегрузкой есть только одна разница (в сигнатурах). Поэтому совершенно естественно, что у меня возник этот вопрос.
Итак, как я поняла, в Java нельзя переопределять статические методы.
Так же я узнала, что ПЕРЕОПРЕДЕЛЕНИЕ - это когда и имена и сигнатуры у методов одинаковые.
Узнала, что ПЕРЕГРУЗКА - это когда имена у методов одинаковые, а сигнатуры разные.
В данном коде методы статические, но переопределение происходит без проблем - компилятор ошибки не выдает.
ВОПРОС: почему говорят что статические методы переопределять нельзя, когда их переопределять МОЖНО?
public class Devocka {
public static void main(String[] args) {
B b = new B();
b.myMessage();
}
}
class A {
public static void myMessage() {
System.out.println("A");
}
}
class B extends A {
public static void myMessage() {
System.out.println("B");
}
}
Ответы (1 шт):
Этим примером вы ничего не доказали. Вы видите В в консоли, потому что написали так:
B b = new B();
Это выражение не может показать работу переопределённых методов даже там, где оно действительно есть. Для того, чтобы продемонстрировать работу переопределённых методов, вам нужно записать так:
А а = new B();
Т.е. вы создаете экземпляр класса и приводите его к переменной суперкласса. Если вы сейчас выведете переменную а в консоль, то увидите А, а не В. Потому что ваш метод статический, и он принадлежит классу. Вы создали экземпляр класса (объект) В и записали его в переменную типа класса А. В том случае, если ваш метод будет нестатический, то вы увидите В, потому что этот метод переопределён, а в переменной типа А записан объект типа В. Но в вашем случае метод статический, посему никакого отношения к объекту он не имеет, он принадлежит классу, а переменная у нас типа А, значит и статический метод отработает для класса А.
