Статические операторы импорта в Java

В Java операторы импорта импортируют классы из пакетов, поэтому их можно использовать в текущем классе без ссылки на пакет. Аналогично, операторы статического импорта импортируют статические члены класса и позволяют использовать их без ссылки на класс.

1. Типы статических операторов импорта

Статическая импортная декларация существует в двух вариантах:

  • одиночный статический импорт: импортирует один статический член(поле или метод) из класса.
  • static-import-on-demand: импортирует все статические члены из класса. Они обозначены звездочкой(*).

1.1 Синтаксис

Общий синтаксис статических операторов импорта выглядит следующим образом:

import static <<package name>>.<<type name>>.<<static member name>>;import static <<package name>>.<<type name>>.*; //On-demand

1.2 Пример

Например, мы можем вывести сообщения в стандартный вывод с помощью метода System.out.println(). System — это класс в пакете java.lang, который имеет статическую переменную с именем out.

Когда мы используем System.out, мы ссылаемся на эту статическую переменную из класса System. Мы можем использовать оператор статического импорта для импорта статической переменной out из класса System следующим образом:

import static java.lang.System.out;

Код теперь может использовать имя out для обозначения System.out в программе. Компилятор будет использовать статическую декларацию импорта для разрешения имени out в System.out.

public class StaticImportTest {public static void main(String[] args) {out.println("Hello World!");}}

2. Правила статического импорта

Ниже приведены некоторые важные правила, касающиеся статических операторов импорта.

2.1. Специально импортированный элемент предшествует импортированному элементу с подстановочным знаком

Если импортируются два статических члена с одинаковым простым именем, один из которых использует объявление single-static import, а другой — объявление static-import-on-demand, то приоритет имеет импортированный с объявлением single-static import.

Предположим, что есть два класса, package1.Class1 и package2.Class2. Оба класса имеют статический метод с именем methodA. Следующий код будет использовать метод package1.Class1.methodA(), поскольку он импортируется с помощью объявления single-static import:

import static package1.Class1.methodA; // Imports Class1.methodA() methodimport static package2.Class2.*; // Imports Class2.methodA() method toopublic class Test {public static void main(String[] args) {methodA(); // Class1.methodA() will be called}}

2.2 Имена статических членов должны быть уникальными.

Использование объявления single-static-import для импорта двух статических членов с одинаковым простым именем не допускается. Следующие объявления статического импорта генерируют ошибку, поскольку оба они импортируют статический член с одинаковым простым именем methodA:

import static package1.Class1.methodA;import static package1.Class2.methodA; // An error

2.3 Статический член, определенный в текущем классе, имеет приоритет

Если статический член импортируется с помощью объявления single-static import и в том же классе существует статический член с тем же именем, то используется статический член в классе.

package package1;public class A {public static void test() {System.out.println("package1.A.test()");}} 
package package2;import static package1.A.test;public class Test {public static void main(String[] args) {test(); //package2.Test.test()}public static void test() {System.out.println("package2.Test.test()");}}

3. Заключение

Статические импорты помогают нам использовать простые имена статических членов, чтобы сделать программу более простой для написания и чтения. Они скорее синтаксический сахар, а не обеспечивают какие-либо преимущества выполнения во время выполнения.

Прокрутить вверх