Базовый класс и производный класс в пакете - PullRequest
3 голосов
/ 06 февраля 2011

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

package Testpackage; // If I comment this then derived class compiles fine

public class Test_class{

    int x,y;


    public static Integer angle;


    public Test_class(int a,int b)
{
    x = a;
        y = b;
}


    public Integer product()
{
    return x*y;
}
}

*************Derived class ****************
package Testpackage;  // If I comment this then it compiles fine

public class Derived_class extends Test_class{

       Integer vol;
      Test_class I = new Test_class(1,2); 
        public Derived_class(){
          super(9,10);
      vol = 0;
   }

       public Integer volume()
   {
         vol = this.product();

         return vol;
   }

}


********* output *************
assa@dasman-laptop:~/Testpackage$ javac Derived_class.java 
Derived_class.java:4: cannot find symbol
symbol: class Test_class
public class Derived_class extends Test_class{
                                   ^
Derived_class.java:7: cannot find symbol
symbol  : class Test_class
location: class Testpackage.Derived_class
          Test_class I = new Test_class(1,2); 
          ^
Derived_class.java:7: cannot find symbol
symbol  : class Test_class
location: class Testpackage.Derived_class
          Test_class I = new Test_class(1,2); 
                             ^
Derived_class.java:15: cannot find symbol
symbol  : method product()
location: class Testpackage.Derived_class
             vol = this.product();

Ответы [ 4 ]

2 голосов
/ 06 февраля 2011

При использовании пакетов вы должны вызывать свой компилятор из каталога в корне иерархии пакетов (в вашем случае ~).

Итак, перейдите на один каталог вверх и вызовите javac следующим образом:

javac TestPackage/Derived_class.java

Тогда компиляция должна работать.Для выполнения вы должны использовать:

 java TestPackage.Derived_class

(но у вашего класса еще нет основного метода).


Редактировать: Почему это необходимо?Когда javac ищет классы, на которые ссылаются ваши классы, он ищет их в соответствии с их пакетом.Ваш Derived_class ссылается на класс TestPackage.TestClass, и он будет найден в TestPackage/TestClass.java (или .class) (относительно пути к классам, который здесь состоит из вашего рабочего каталога).Такой директории не существует, когда вы уже находитесь внутри директории TestPackage.

Другой способ вызвать ее здесь - использовать

javac -cp .. Derived_class.java

, поскольку тогда javac будет искать связанные классы изродительский каталог.Затем вы должны также установить параметр '-d', чтобы поместить сгенерированные файлы классов в правильную структуру.Позвоните по номеру javac -help, чтобы получить сводную информацию о параметрах, или обратитесь к документации JDK, чтобы получить более подробное описание всех параметров.

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

0 голосов
/ 06 февраля 2011

После того, как вы поместили классы в пакет, вы должны убедиться, что ваш classpath установлен правильно, чтобы найти классы в нужном месте.

Например, если вы не используете classpath, тогда ваш classpathпринимается за "."(т.е. текущий рабочий каталог является единственным каталогом в пути к классам).Поэтому, когда вы компилируете свои классы без объявлений пакетов в них, он помещает файлы классов в текущий каталог, а затем, когда ищет их, он успешно находит их в вашем пути к классам.

Затем, если вы добавляете объявления пакетови скомпилируя их, компилятор будет искать пакеты в "./Testpackage" и не найдет их (потому что компилятор все еще помещает файлы классов в текущий каталог).

Простое решение - это когда вы добавляете объявления пакетов в ваш класс, а также перемещаете их в каталог, который отражает этот пакет, т.е."./Testpackage".Затем вызовите компилятор с «Testpackage / *. Java».Когда вы хотите, чтобы классы были в пакете по умолчанию, удалите объявления пакета и переместите класс обратно в «.».

0 голосов
/ 06 февраля 2011

Классы, определенные в одном пакете, импортировать не нужно.Я подозреваю, что у вас нет исходных файлов в дереве каталогов, совпадающих с пакетом, который вы собираете ... но я вижу, что у вас есть.Также убедитесь, что ваш classpath настроен правильно.

Посмотрите на эту страницу наполовину подробнее: http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html

И сначала создайте базовый класс.

0 голосов
/ 06 февраля 2011

С пакетами нужно импортировать из нужной упаковки.Ранее вы определяли при импорте и из пакета «по умолчанию» (без имени / без имени), но теперь вы определяете свои классы в TestPackage, поэтому вам нужно будет импортировать из TestPackage.

Например: import TestPackage.Test_class;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...