Статические методы
Статические методы можно вызывать не используя ссылку на объект. В этом их ключевое отличие от обычных методов класса. Для объявления таких методов используется ключевое слово static . На методы, объявленные как static , накладывается следующие ограничения:
- Они могут непосредственно вызывать только другие статические методы.
- Им непосредственно доступны только статические переменные.
- Они не могут делать ссылки типа this или super .
Пример использования статических методов:
public class StaticMethodClass < static int staticVar = 3; int nonStaticVar; public void nonStaticMethod() < System.out.println("Нестатический метод"); >static void staticMethod(int localVar) < System.out.println("localVar = " + localVar); System.out.println("staticVar = " + staticVar); //Нельзя обратиться к нестатической переменной из статического метода //System.out.println("nonStaticVar language-java">public class StaticMethodDemo < public static void main(String[] args) < StaticMethodClass.staticMethod(42); >>
- Статические переменные
- Статический блок
- Java static import
- Задания
Trustpilot
Комментарии
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.
Параметризация метода
В том же туториале утверждается, что компилятор распознаёт тип и т.д. Значит на этапе компиляции уже кое-что известно.
2) Вопрос не понятен. Что значит "отдельно параметризовать"? Вроде в том же файле с исходным кодом класса все делается? Т.е. ничего особливого для статических методов нет.
Вверху был статический, тут напишем не статический. Всё одинаково:
public void fromArrayToCollection(T[] a, Collection c) < for (T o : a) < c.add(o); // Correct >>
Как параметризировать статический метод java
Вы можете параметризовать статический метод передавая ему в качестве аргумента обобщенный тип. Например, рассмотрим следующий пример статического метода, который суммирует два числа:
public class MathUtils public static int sum(int a, int b) return a + b; > >
Вы можете параметризовать этот метод, передав ему в качестве аргументов два объекта типа T , где T - это обобщенный тип, как показано в следующем примере:
public class MathUtils public static T extends Number> double sum(T a, T b) return a.doubleValue() + b.doubleValue(); > >
В этом примере мы использовали обобщенный тип для параметризации метода sum() . Здесь мы ограничиваем тип T , чтобы он был типом Number или его подклассом, и таким образом мы можем использовать метод doubleValue() для преобразования значения объектов типа T в тип double
Таким образом, мы можем вызвать параметризованный статический метод sum() следующим образом:
int result = MathUtils.Double>sum(3.5, 2.5); // 6.0
Здесь мы явно указываем, что тип T является типом Double
Особенности использования статических методов в интерфейсах Java
Как известно, начиная с версии JDK 8.0 в Java наряду с так называемыми дефолтными методами появились также и статические методы. Например, до появления Java 8 нельзя было прописывать подобный интерфейс:
public interface IStaticMetodContainer
static void printed(String s)
Тем не менее, была возможность использовать статический вложенный класс в интерфейсе (начиная с версии Java 2.0). Используя возможности только Java 2.0 этот же пример выше мог бы выглядеть, например, следующим образом:
public interface IClassContainer
public static void printed(String s)
Создадим специальный класс IClassTest для проверки работы методов. И запустим метод main:
public class IClassTest
public static void main(String[] args)
Как видим, результат идентичен для обоих вариантов:
"C:\Program Files\Java\jdk-13.0.2\bin\java.exe" -Didea.launcher.port=54478 "-
Process finished with exit code 0
Таким образом, немедленно напрашивается первый вывод об особенностях применения статических методов в интерфейсах, а именно, что они могут в некоторых случаях заменить собой использование статических классов в интерфейсах, несколько упростив логику инкапсулирования кода для ряда задач. И, действительно, статические методов довольно часто используются в качестве вспомогательных или утилитных методов. Что, собственно, присуще и статическим классам в интерфейсах.
Еще одной интересной особенностью статических методов в интерфейсах является невозможность переопределения подобного метода в классе, имплементирующем интерфейс. Статические методы являются частью интерфейса и не «передаются» классу, поэтому можно сказать, что переопределение в данном случае не то, что невозможно, но и непредусмотрено. Поэтому, можно в классе-имплементоре спокойно реализовывать свой метод с идентичной сигнатурой, однако, он все равно не заменит аналогичный метод в интерфейсе и не будет сообщений от IDE с требованием вставить аннотацию @Override. Более того, использование аннотации @Override даст ошибку компиляции. Рассмотрим на следующем примере, предварительно немного видоизменив исходный интерфейс IStaticMetodContainer и добавив в него дефолтный метод:
public interface IStaticMetodContainer
static void printed(String s)
default void print(String s)
printed("default part included "+s);
И определим следующий класс-имплементор для данного интерфейса:
public class IStaticMetodContainerImpl implements IStaticMetodContainer
static void printed(String s)
System.out.println("printing from class ::"+s);
Источник информации: преподаватель кафедры технологий программирования Сабитов Ш.Р.
![]()
Ключевые слова: Java, статические методы, наука
- Сотрудники
- Образование
- Наука
- Научно-популярные статьи
- Информационный дайджест