Какова роль статического ключевого слова в импорте java.ленг.Системный класс?

я не понимаю значение ключевого слова static когда я импортирую System класс:

import static java.lang.System.*

я читаю книгу о Java и там написано:

любая декларация импорта, которая не использует слово static должны начать с именем пакета и должен заканчиваться одним из следующих:

  • имя класса в этом пакете
  • звездочка (с указанием всех классов, в том пакет)

например, импорт декларации java.util.Scanner; действителен потому что java.util - это имя пакета в API Java, и Scanner - это имя класса в .

вот еще один пример. Декларация import javax.swing.*; действителен потому что javax.swing - это имя пакета в API Java, и звездочка относится ко всем классам в javax.swing пакета.

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

public class Addition {

   public static void main(String[] args) {
      double num;
      num = 100.53;

      num = num + 1000;

      // So when I want to import the whole package java.lang as written in the book, it doesn't work:
      // import java.lang.*;
      // or like this:
      // import static java.lang.*;
      // NetBeans in both cases doesn't see these abbreviated names `out` and throws errors. Why?
      out.print("The result is ");
      out.print(num);
      out.println(" .");
   }
}

и он работает, когда я импортирую таким образом:

import static java.lang.System.out;
import static java.lang.System.*

но не работает, когда я пытаюсь сделать это:

import java.lang.System.out;
import java.lang.System.*

что означает static ключевое слово в данном случае?

и почему import java.lang.*; не импортирует весь пакет с System класса в нем?

4 ответов


A static импорт позволяет написать следующее:

out.print("The result is ");

вместо этого:

System.out.print("The result is ");

см., например,http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html.


Я часто использую статический импорт в мои юнит-тесты, например, так:

import static org.junit.Assert.*;

Это позволяет мне написать этот код:

assertEquals(2, list.size());

вместо этого кода:

Assert.assertEquals(2, list.size());

статический импорт-это функция, введенная на языке программирования Java, которая позволяет членам (полям и методам), определенным в классе как public static, использоваться в коде Java без указания класса, в котором определено поле. Эта функция была введена в язык в версии 5.0.

функция предоставляет механизм typesafe для включения констант в код без необходимости ссылаться на класс, который первоначально определил поле. Это также помогает осудить практика создания постоянного интерфейса: интерфейс, который определяет только константы, затем пишет класс, реализующий этот интерфейс, который считается нецелесообразным использованием интерфейсов.

при импорте со статическим ключевым словом это означает, что вы просто вставили его как-то в свой класс, и вы можете использовать его методы так же, как вы вызываете методы своих собственных классов.

например:

import static java.lang.Math.*;
import static java.lang.System.out;

и :

out.println("I have a house with an area of " + (PI * pow(2.5,2)) + " sq. cm");

вопросы:

1) это работает, когда я импортирую так:

a. import static java.lang.System.out;
b. import static java.lang.System.*

но не работает, когда я пытаюсь сделать это:

c. import java.lang.System.out;
d. import java.lang.System.*;

2) что означает ключевое слово static в данном конкретном случае?

3) и зачем импортировать java.ленг.* ; не импортирует весь пакет с классом System в это?

--------------------------------------------------------------------------------

ответы:

1) & 2) статический импорт например (импорт статической java.ленг.Система.out) используются для импорта методов или полей, объявленных как статический внутри других классов в данном конкретном случае из системного класса.

a. import static java.lang.System.out; //Works because "out" is a static field
b. import static java.lang.System.*; //Works because you are importing ALL static fields and methods inside the System class

c. import java.lang.System.out; //Does NOT work because you are trying to import a static field in a non-static way. (see a.)
d. import java.lang.System.*; //Actually Works because of the * wildcard which allows you to include all imports.

основная причина, по которой вы хотите импортировать методы или поля статическим способом, поэтому вы можете опустить спецификацию класса для всех вызовов этих методов или полей. Поэтому вместо того, чтобы писать:

System.out.print("Hello");
System.out.print("World");

только писать

import static java.lang.System.*   //or   import static java.lang.System.out if you only plan on using the 'out' field.
out.print("Hello");
out.print("World");

3) импорт java.ленг.* избыточна! Java автоматически и неявно импортирует этот пакет для вас! :) и да, он импортирует системный класс с ним, но не запутайтесь, если вы не импортировали его как статический импорт, вам все равно нужно будет записать длинный путь:

System.out.print("hi");