#java #interface
#java #интерфейс
Вопрос:
Я реализую следующий пример интерфейса:
package test1;
public interface MotorVehicle {
void run();
int getFuel();
}
В классе
package test1;
import test1.MotorVehicle;
public class Car implements MotorVehicle
{
int fuel;
public void run(){
System.out.println("Running");
}
public int getFuel(){
return this.fuel;
}
}
Когда я пытаюсь скомпилировать файл класса, я получаю следующую ошибку :
Car.java:4: error: cannot find symbol
public class Car implements MotorVehicle
^
symbol: class MotorVehicle
1 error
Шаги компиляции:
Шаг: 1 javac MotorVehicle.java
Шаг:2 javac Car.java
И мой интерфейс, и класс находятся в одном каталоге, почему ut выдает ошибку «не удается найти символ»?
Редактировать: Как и предлагалось, изменили пакет и попытались снова запустить тот же код . По-прежнему выдается ошибка.
Комментарии:
1. Как вы пытаетесь его скомпилировать? Есть ли классы в каком-либо пакете (у них есть
package
объявление)?2. Вы добавили свой каталог в classpath? Какую IDE o вы используете?
3. @Dibya это не имеет никакого отношения к ошибке.
4. Вы
import
проверили интерфейс? Вы объявили, что они находятся в одном пакете? Если вы не сделали ни того, ни другого, я не понимаю, почему это должно компилироваться.5. Находятся ли оба класса внутри папки «test»? Вот что говорится в
package
информации. Если эта информация не соответствует реальной ситуации, вы можете получить ошибки.
Ответ №1:
Проблема в том, что вы находитесь не в той папке при компиляции. На скриншоте консоли видно, что вы находитесь внутри /test1
. Однако package test1;
оператор ожидает папку внутри текущей папки с именем test1
. Он не может найти эту папку / пакет, поэтому вы получаете сообщение об ошибке.
Решение состоит в том, чтобы перейти в одну папку, чтобы вы оказались в /src
, затем скомпилировать, используя путь к файлу, например javac test1/Car.java
. Объяснение: Вы находитесь в папке /src
, package
инструкция внутри классов говорит, что они находятся внутри папки, test1
которая находится внутри /src
. Теперь каждый пакет / путь может быть разрешен.
И вы не должны import
использовать вещи, которые находятся в одном пакете.
Комментарии:
1. Спасибо за объяснение. Теперь все проясняется. Теперь все в порядке, после реализации вашего предложения. Мне понравился простой язык, на котором вы объяснили, поэтому принял ответ
Ответ №2:
Прежде всего, поскольку ваше имя пакета test
вы должны сохранить свой класс и интерфейс в папке с именем test
.
Второе, поскольку они находятся в одной папке с именем test
удалить import test.MotorVehicle;
из определения класса
Предположим, что ваша папка test
находится в g:/
таком, что g:/test/contains класс и интерфейс.
Затем попробуйте открыть командную строку в g:/
затем введите следующие команды
для компиляции
javac test/Car.java
и для выполнения
java test.Car
Хотя вы можете получить Error: Main method not found in class test.Car
поскольку ваш класс не содержит основного метода
Комментарии:
1. Он не пытается запустить, и у Car нет основного метода
Ответ №3:
Вы переходите к точному пути с помощью cd
команды.Из-за этого интерфейс недоступен, поскольку класс попытается найти его из пакета из текущего / запущенного местоположения.
Для выполнения этой компиляции вы должны указать полностью (снова полностью) точное имя пакета во время компиляции.
Например
Если ваш класс находится в a.b.test
пакете, скомпилируйте его следующим образом
javac a/b/test/Car.java
Ответ №4:
Сначала скомпилируйте MotorVehicle
, поскольку у него нет никаких зависимостей. Затем задайте путь к классу
Перед выдачей javac Car.java
инструкций компиляции вам необходимо установить Classpath
Windows
set CLASSPATH=%CLASSPATH%;<PATH_TO_COMPILED_BINARY>/
Unix
export CLASSPATH=$CLASSPATH:<PATH_TO_COMPILED_BINARY>/
<PATH_TO_COMPILED_BINARY>
не должен включать пакет test1
Пример :
C:/sourcecode/test1
Тогда <PATH_TO_COMPILED_BINARY>
должно быть C:/sourcecode
Обновить
Удаление import test1.MotorVehicle
также устранит проблему.
Комментарии:
1. javac работает нормально, так как я могу успешно скомпилировать другие файлы Java. Требуется ли по-прежнему указывать путь к классу?
2. Да, вам нужно установить путь к классу так, чтобы он указывал на тест пакета перед компиляцией car.
3. @SotiriosDelimanolis Я говорю не об исходном коде, а о скомпилированных файлах .class. Извините за недоразумение, пожалуйста, посмотрите на редактирование.
Ответ №5:
После компиляции Motorvehicle.java. вы должны создать папку test1 и перенестиMotorVehicle.class в папку test1 затем скомпилируйте следующий файл Car.java . Это решит вашу ошибку