Из Записок Фреда Шварца (фредозавра) :
Существует два типа методов.
Методы экземпляра связаны с объектом и используют переменные экземпляра этого объекта.Это значение по умолчанию.
Статические методы не используют переменные экземпляра какого-либо объекта класса, в котором они определены. Если вы определяете метод как статический, выкомпилятор получит грубое сообщение, если вы попытаетесь получить доступ к любым переменным экземпляра.Вы можете получить доступ к статическим переменным, но за исключением констант, это необычно.Статические методы обычно берут все данные из параметров и вычисляют что-то из этих параметров без ссылки на переменные.Это типично для методов, которые делают какие-то общие вычисления.Хорошим примером этого являются многие служебные методы в предопределенном классе Math
.
Квалификация статического вызова
Из-за пределов определяющего класса метод экземпляра имеет видвызывается с префиксом объекта, который затем передается в качестве неявного параметра методу экземпляра, например, inputTF.setText("");
Статический метод вызывается с префиксом имени класса, например, Math.max(i,j);
,Любопытно, что он также может быть квалифицирован с объектом, который будет игнорироваться, но будет использоваться класс объекта.
Пример
Вот типичный статический метод:
class MyUtils {
. . .
//================================================= mean
public static double mean(int[] p) {
int sum = 0; // sum of all the elements
for (int i=0; i<p.length; i++) {
sum += p[i];
}
return ((double)sum) / p.length;
}//endmethod mean
. . .
}
Единственные данные, которые этот метод использует или изменяет, - это параметры (или, конечно, локальные переменные).
Зачем объявлять метод static
Вышеуказанный метод mean()
будет работать так же хорошо, если он не будет объявлен как статический, если он вызывается из того же класса.Если вызывается извне класса, и он не был объявлен как статический, он должен быть квалифицирован (бесполезно) с объектом.Даже при использовании в классе есть веские причины определять метод как статический, когда он может быть.
- Документация. Любой, кто видит, что метод статический, знает, как его вызывать (см. Ниже).Точно так же любой программист, изучающий код, будет знать, что статический метод не может взаимодействовать с переменными экземпляра, что облегчает чтение и отладку.
- Эффективность. Компилятор обычно генерирует немного более эффективный код, поскольку в метод не нужно передавать неявный параметр объекта.
Вызов статических методов
Существует два случая.
Вызывается из одного класса
Просто напишите имя статического метода.Например:
// Called from inside the MyUtils class
double avgAtt = mean(attendance);
Вызывается извне класса
Если метод (статический или экземпляр) вызывается из другого класса, перед именем метода должно быть указано что-тоуказать класс, где метод определен.Например, методы, это объект, к которому метод получит доступ.Для статических методов должно быть указано имя класса.Например:
// Called from outside the MyUtils class.
double avgAtt = MyUtils.mean(attendance);
Если перед ним указан объект, значение объекта будет проигнорировано и будет использован класс объекта.
Доступ к статическим переменным
Кроме того, метод static
не может получить доступ к переменным экземпляра, он может получить доступ к static
переменным.Обычное использование статических переменных - определение «констант».Примеры из библиотеки Java: Math.PI
или Color.RED
.Они квалифицированы по имени класса, так что вы знаете, что они static
.Любой метод, static
или нет, может получить доступ к static
переменным.Переменные экземпляра могут быть доступны только методами экземпляра.
Альтернативный вызов
Немного странным и не рекомендуемым является то, что объект класса может использоваться вместо имени класса для доступа к статическим методам.Это плохо, потому что создается впечатление, что в объекте используются переменные экземпляра, но это не так.