#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
. Компилятор не будет искать другие пакеты, если вы не укажете ему.