Должно ли имя класса быть полным, если мы уже установили -classpath для поиска этого файла?

#java

#java

Вопрос:

Пример:

У меня есть класс с именем progA

 package test;
public class ProgA
{
   public static void main(String[] args)
   { 
      ProgB pb = new ProgB();
      pb.callMe();
   }
}
  

Теперь у меня есть progB, как показано ниже:

 package test2;
public class ProgB
{
   public void callMe()
   {
     System.out.println("inside callme");
   }
}
  

После компиляции ProgB.java его файл класса генерируется в пакете test2. Теперь, когда я пытаюсь скомпилировать ProgA.java использование этой команды:

 javac -cp C:UsersMyNameDesktoptest2 ProgA.java
  

Я получаю сообщение об ошибке, что он не может найти progB.
Мой вопрос в том, почему java не может заглянуть в путь к классу, чтобы найти ProgB.class файл и скомпилируйте мой ProgA.java успешно? Код работает нормально, когда я указываю полное имя класса progB внутри ProgA.java кодируйте и запускайте с заданным путем к классу -classpath C:UsersMyNameDesktop . Зачем иметь полностью заполненное имя, когда я уже указываю полный путь к классу для поиска progB. Я не совсем понимаю эту концепцию classpath и полного имени класса. Пожалуйста, объясните мне. Спасибо

Комментарии:

1. Я считаю, что вам нужно сначала импортировать его. Что-то вроде import test2.ProgB; . Я не уверен, так как это было десятилетия назад, когда я окунулся в Java.

2. Два класса находятся в разных пакетах. (test и test2) Они не будут искать за пределами своего собственного пакета, если не указано иное.

3. Итак, @KRichardson вы пытаетесь сказать, что нам нужно сообщить компилятору, что progB не находится в том же пакете, что и progA, указав его полное имя. Без какого компилятора progB считает, что он находится в том же пакете, что и progA, и даже не просматривает classpath для сканирования?

4. Правильно, класс не будет искать за пределами своего собственного пакета, если вы не сообщите ему об этом. Это предотвращает неоднозначность проблем, когда в нескольких пакетах могут быть классы с одинаковыми именами.

5. Понял 🙂 Спасибо за ответ.

Ответ №1:

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

 import test2.ProgB;
  

Затем во время компиляции вы должны указать путь к классу до корневого расположения, компилятор будет искать класс, используя имя пакета в качестве пути.

Ваша команда компиляции должна быть.

 javac -cp C:UsersMyNameDesktop ProgA.java
  

Ответ №2:

Чтобы использовать класс из другого пакета, вам нужно либо использовать полное имя класса, либо иметь import инструкцию. Это .java требование к исходному коду. Это нельзя исправить, просто изменив classpath компилятора.

Без инструкции import предполагается, что неквалифицированные имена принадлежат пакету текущего исходного файла. Если вы находитесь в package test файле, идентификатор ProgB будет совпадать test.ProgB , но нет test2.ProgB . Компилятор не будет искать другие пакеты, если вы не укажете ему.