基础班&包中的派生类

时间:2011-02-06 03:42:20

标签: java inheritance

当我在同一目录中创建基类和派生类而没有指定任何包时,它们编译得很好,但是将它们添加到包导致派生类中的错误,说它无法找到基类的符号。这个错误很令人沮丧,因为我以前一直在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 个答案:

答案 0 :(得分:2)

使用包时,应该从包层次结构的根目录(在您的情况下为~)中调用编译器。

所以,进入一个目录,然后以这种方式调用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不需要搜索更多的文件。

答案 1 :(得分:0)

使用软件包,您需要从正确的软件包导入。以前,您一直在使用“默认”(未声明/未命名)包中的进行定义,但现在您要在TestPackage中定义类,因此您需要从TestPackage导入。

例如:import TestPackage.Test_class;

答案 2 :(得分:0)

不需要导入在同一个包中定义的类。我怀疑你没有与你正在构建的包相匹配的目录树中的源文件......但是我知道你这样做了。还要检查以确保您的类路径设置正确。

在此页面中间查看更多内容:http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html

首先构建基类。

答案 3 :(得分:0)

将类放入包后,必须确保正确设置类路径以在正确的位置找到类。

例如,如果您不使用类路径,那么您的类路径将被视为“。” (即当前工作目录是类路径中唯一的目录)。因此,当您编译没有包声明的类时,它会将类文件放在当前目录中,然后在查找它们时,它会在类路径中成功找到它们。

然后,如果你添加包声明并编译它们,编译器将在“./Testpackage”中查找包而不找到它们(因为编译器仍然将类文件放在当前目录中)。

简单的解决方案是将包声明添加到类中,也将它们移动到反映该包的目录中,即“./Testpackage”。然后使用“Testpackage / * .java”调用编译器。如果希望类在默认包中,请删除包声明并将类移回“。”。