导入不同目录中的类

时间:2014-08-11 23:00:58

标签: java interface package inner-classes

实际上,我正试图在#34; Think in Java"用于自学目的 -

练习6:(2)在自己的包中创建一个至少包含一个方法的接口。创建一个 在一个单独的包中的类。添加一个实现接口的受保护内部类。在一个 第三个包,继承自您的类,并在方法内返回一个对象 受保护的内部类,在返回期间向上转换为接口。

所以我在目录" a"下创建了一个名为IgetResult.java的类。它有一个IIGetResult接口。

interface IIGetResult {
    String getResult();
}
public class IgetResult {
} 

然后我在另一个目录中创建另一个类 - 目录b

import a.IgetResult.IIGetResult;

public class PracticeClass {
    protected class inner implements IIGetResult {
        @Override
        String getResult(){ return "result";}
    }

    public static void main(String[] args) {
        System.out.println("practice start");
    }

}

在最后一步中,我使用命令编译两个java类:

#javac a / .java b / .java

并收到以下错误:

./a/IgetResult.java:1: duplicate class: IIGetResult
interface IIGetResult {
^
./a/IgetResult.java:4: duplicate class: IgetResult
public class IgetResult {
       ^
b/PracticeClass.java:1: cannot access a.IgetResult
bad class file: ./a/IgetResult.java
file does not contain class a.IgetResult
Please remove or make sure it appears in the correct subdirectory of the classpath.
import a.IgetResult.IIGetResult;
    ^

请教我完成这个练习,提前谢谢。

3 个答案:

答案 0 :(得分:3)

根据引用:

  

在自己的包中创建一个至少包含一个方法的接口。

因此,我们在文件夹IGetResult.java中创建a文件:

package a;

public interface IGetResult {
    String getResult();
}
  

在单独的包中创建一个类。添加一个实现接口的受保护内部类。

现在我们在一个单独的包(文件夹)中创建一个类,内部类实现了接口:

package b;
import a.IGetResult;

public class InnterTest {
   protected class GetResultImpl implements IGetResult {
       @Override
       String getResult() { return "result"; }
   }

} 
  

在第三个包中,继承自您的类,并在方法内部返回受保护内部类的对象,在返回期间向上转换为接口

现在我们在第三个单独的包中创建一个InnerTest类的子类:

package c;
import a.IGetResult;
import b.InnterTest;

public class InnerTestSubclass extends InnerTest {

   public IGetResult getResultClass() {
      //Up-casting happens automatically since GetResultImpl is sub-class of IGetResult
      return new GetResultImpl();
   }
}

我手工打字,但你应该明白这个想法。希望有所帮助。

答案 1 :(得分:1)

我可以看到以下问题:

  1. 您错过了'包< a / b / c>'你班上的宣言。

  2. 您的a.IIGetResult界面应该是公开的,否则它不会在' b'中显示出来。封装

  3. Java约定用于以大写字母开头的类名,因此你的内部类中的PracticeClass应命名为' Inner'代替。

  4. 您的内部类应该有一个公共构造函数,以便可以从另一个包中定义的扩展PracticeClass的类中调用后者。

  5. 重写的inner.getResult()方法应该是公开的(但是在主题之外)。

  6. 你的班级IGetResult应该在第三个包(c?)中定义,并且应该扩展到PracticeClass(虽然我必须承认你的指示对我来说有点混乱)。

  7. 以上几点和@ dimoniy的答案一致,你应该没问题。

答案 2 :(得分:0)

您的课程需要在您的界面内。这需要位于名为IIGetResult.java的文件中

interface IIGetResult {
    String getResult();

    public class IgetResult implements IIGetResult{
        @Override
        String getResult() { return null; }
    } 
}