В Java - «Статические члены пакета по умолчанию не могут быть импортированы» - может кто-нибудь объяснить это утверждение? - PullRequest
11 голосов
/ 26 декабря 2009

В Java - «Статические члены пакета по умолчанию не могут быть импортированы» - может кто-нибудь объяснить это утверждение? Было бы лучше, если бы это было на примере. Я не уверен, что у него есть действительно простой ответ, но затем я попытался понять, но не мог понять это.

Ответы [ 2 ]

19 голосов
/ 26 декабря 2009

Это означает, что если класс определен в пакете по умолчанию (то есть он не не имеет какого-либо определения пакета), вы не можете импортировать его статические методы в другой класс. Поэтому следующий код не будет работать:

// Example1.java
public class Example1 {
  public static void example1() {
    System.out.println("Example1");
  }
}

// Example2.java
import static Example1.*; // THIS IMPORT FAILS
public class Example2 {
  public static void main(String... args) {
    example1();
  }
} 

Импорт завершается неудачно, потому что вы не можете импортировать статические методы из класса, который находится в пакете по умолчанию, как в случае Example1. На самом деле, вы даже не можете использовать нестатический импорт.

В этом отчете об ошибке есть некоторое обсуждение того, почему Java действует таким образом, и в итоге он был закрыт как "не дефект" - это способ, которым Java была разработана, чтобы действовать. Пакет по умолчанию имеет неожиданное поведение, и это одна из причин, по которой программистам никогда не рекомендуется использовать пакет по умолчанию.

2 голосов
/ 26 июня 2017

как упоминает @kageb Brasee: Это правда, что вы не можете выполнять статический или нестатический импорт класса, который находится в пакете по умолчанию.

но есть случай, когда вы можете использовать класс (пакета по умолчанию) в другом классе: -> И это можно сделать только тогда и только тогда, когда этот класс (в котором вы хотите использовать класс пакета по умолчанию) также присутствует в пакете по умолчанию

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

например. если я хочу импортировать класс temp.class (который входит в пакет по умолчанию), расположенный в Home/files/temp.class, в мою программу use.java

, затем просто установите CLASSPATH во время компиляции Вы можете сделать это двумя способами: постоянный набор или временный набор ( Не используя технические термины )

постоянный набор: путем установки переменной CLASSPATH (которая является переменной окружения) (различные способы сделать это для разных ОС) -> для mac - -> export CLASSPATH=Home/files/ в этом методе переменная окружения CLASSPATH устанавливается до тех пор, пока ваша terminal не будет открыта

так в этом случае:

 export CLASSPATH=Home/files/
 javac use.java
 java use

временный набор : в этом методе мы используем одну из двух опций, предусмотренных как для java, так и для javac (java compiler), и это -classpath и -cp (оба они выполняют одну и ту же работу, его просто -cp - это сокращение от -classpath), в этом методе установки classpath для других файлов основное отличие состоит в том, что в этом типе адрес (путь) файла задается только на период времени, пока эта команда (операция) выполняется как только выполнение инструкции завершится, значение CLASSPATH (среда) -> снова достигнет того же пути, что и ранее,

Примечание: по умолчанию CLASSPATH равен. (т.е. представляет один и тот же каталог)

И в этом случае:

 java -cp .:Home/files use.java    // Note: don't forget . and : is for separating the different paths
 java use

Надеюсь, это помогло:)

...