使用Point作为外部类编写内部类

时间:2011-11-13 21:54:38

标签: java class inner-classes nested-class

对于赋值,我需要在java.awt.Point中的类Point中创建一个类。我需要能够在为内部/嵌套类创建自己的变量时使用点方法。我对静态嵌套类和内部类之间的差异感到有点困惑,并且不知道使用哪一个。我试图使用静态嵌套类,并遇到一个错误,指出“修改器静态不允许在这里”

我误入歧途的尝试:

class Point {
    static class RobotJAW {

        int goldcollected, x, y;

        RobotJAW() {
            goldcollected = 0;
            alive = true;
            x = 0;
            y = 0;
        }

    }
}

创造这个类的重点是让机器人在被炸弹摧毁的同时搜寻黄金和炸弹并收集黄金。我只能使用java API中的Point和Scanner类。我需要使用点方法equals(obj),move(int x,int y),getLocation()和setLocation(int x,int y)。但我需要添加goldcollected和alive变量。此外,这是一个学校的任务,所以我想获得更多关于这个主题的知识,以及一些指导,而不是给别人工作。

2 个答案:

答案 0 :(得分:1)

  

对于作业,我需要在java.awt.Point。

类Point中创建一个类

如果您拥有外部类的源代码并且可以重新编译它,则只能在类中创建类。您不能对java.awt.Point执行此操作。

如果您认为自己的作业告诉您这样做,那么您可能误解了您的作业所说的内容。

当然,在Point中创建嵌套类没有多大意义。 AFAIK,没有任何(明智的)嵌套在Point中的类可以做到这一点,这是非嵌套类无法完成的。也许作业要求你extend Point班;即创建一个子类而不是嵌套类。


(实际上,理论上可以这样做,但不能用纯Java;例如

  • 您可以下载OpenJDK的源代码,将您的嵌套类添加到java.awt.Point并重建。但你最终得到的不是Java。

  • 您可以使用字节码魔法为嵌套类构建类文件。只要你做对了,它就是可加载的,并且(我认为)它将能够访问外部类的私有方法和属性。但这不是纯粹的Java。

这两种方法都是非常糟糕的想法,这几乎肯定不是你的任务所期望的。)

答案 1 :(得分:0)

关于内部课程如何运作的教训,然后有人怀疑这是你真正需要的。 内部类用于描述与另一个类具有极强属性关系的类。如此强烈的事实,如果没有外部阶级,它就无法生存。如此强大,你很少需要它。内部类只能通过外部类的实例访问:

public class A{
  public int value1;
  public class B{
    public int value2;
  }
}
...
A a1 = new A()
a1.value1 = 202
A.B b1 = new a1.B();
System.out.println(b1.value1); //Prints 202
A.B b2 = new B(); //Compiler error! Not allowed

静态内部类实际上不是内部类。它只是一个在内部类中定义的类。

在我看来,你想要的是RobotJaw要么要点,要么有点。你不希望它成为一个点不可挽回地包含的对象。所以要么让RobotJaw扩展一个Point,要么包含一个点。