Что может пойти не так с вызовом статического метода с объектом в Java? - PullRequest
3 голосов
/ 21 августа 2009

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

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 () как статический метод, или есть какая-то техническая тонкость?

Ответы [ 5 ]

8 голосов
/ 21 августа 2009

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

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

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

2 голосов
/ 21 августа 2009

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

1 голос
/ 21 августа 2009

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

1 голос
/ 21 августа 2009

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

0 голосов
/ 21 августа 2009

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

...