Как параметризовать статический метод java
Перейти к содержимому

Как параметризовать статический метод java

  • автор:

Статические методы

Статические методы можно вызывать не используя ссылку на объект. В этом их ключевое отличие от обычных методов класса. Для объявления таких методов используется ключевое слово 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, статические методы, наука

  • Сотрудники
  • Образование
  • Наука
  • Научно-популярные статьи
  • Информационный дайджест

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *