Что может пойти не так, как вызвать статический метод с объектом в Java?

76
3

Если у меня есть следующее:


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

public class Main {
public static void main(String [] args) {
A a = new A();
a.foo(); // <-- static call using an instance.
A.foo(); // <-- static call using class
}
}


Существуют ли какие-либо проблемы, возникающие при вызове foo() с помощью экземпляра? Подходит ли JVM к первому вызову foo() точно как статический метод или есть какая-то техническая тонкость?

спросил(а) 2020-04-04T00:29:47+03:00 3 месяца назад
1
Решение
116

Его очень легко ввести тонкие логические ошибки, вызывая статические методы из экземпляров. Дело в том, что это не делает то, что вы думаете:


Thread t = new Thread(...);
t.sleep(1000);

sleep - статический метод, который приостанавливает текущий исполняемый поток, а не экземпляр потока.

ответил(а) 2020-04-04T00:45:07.722105+03:00 3 месяца назад
67

Два вызова одинаковы. Проблема, которая приходит на ум, заключается в переопределении класса A, вы не можете напрямую переопределить foo().

ответил(а) 2020-04-04T00:29:47+03:00 3 месяца назад
54

Его просто считают плохой формой/практикой. Избегайте этого.

ответил(а) 2020-04-04T00:29:47+03:00 3 месяца назад
55

Одна из веских причин заключается в том, что вы можете запутать других людей, которым может потребоваться прочитать или обновить код. Это действительно "похоже", поскольку экземпляр объекта должен быть задействован в вызове метода, когда на самом деле он не является (и на самом деле он может быть нулевым). Это ненужное обфускация.

ответил(а) 2020-04-04T00:29:47+03:00 3 месяца назад
39

Не 100% уверен, но вы можете столкнуться с ошибкой нулевого указателя, если ваш экземпляр имеет значение null.

ответил(а) 2020-04-04T00:29:47+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема