【问题标题】:Coding an inner class with Point as outer class使用 Point 作为外部类编写内部类
【发布时间】:2011-11-13 21:54:37
【问题描述】:

对于作业,我需要在 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 变量。另外,这是学校的作业,所以我想获得更多关于这门学科的知识和一些指导,而不需要别人的工作。

【问题讨论】:

  • 欢迎新用户!从历史上看,我们遇到过一些人只是想将代码交给他们,所以很高兴看到“我想获得更多关于这个主题的知识和一些指导,而不需要别人的工作。”

标签: java class inner-classes nested-class


【解决方案1】:

对于作业,我需要在 java.awt.Point 的类 Point 中创建一个类。

如果你有外部类的源代码并且可以重新编译它,你只能在一个类中创建一个类。 java.awt.Point 不能这样做。

如果你认为你的任务是告诉你这样做,那么你可能误解了你的任务在说什么。

当然,在Point 中创建嵌套类没有多大意义。 AFAIK,没有什么(明智的)嵌套在 Point 中的类可以做到非嵌套类无法做到的。也许作业要求你去extendPoint 班级;即创建一个子类而不是嵌套类。


(其实理论上是可以做到的,但是纯Java不行;例如

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

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

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

【讨论】:

    【解决方案2】:

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

    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 扩展一个点,要么包含一个点。

    【讨论】:

    • 如果 RobotJAW 的构造函数包含一个点,我是否仍然能够添加自己的变量并仍然在对象上使用点方法?
    • @user1043550 如果它包含一个点,您可以添加一个返回该点的 .getLocation() 方法,然后您可以对其进行操作。当然,您可以将任何您想要的内容添加到 RobotJAW 本身,所以可以。
    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 2012-10-06
    • 1970-01-01
    • 2023-01-24
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多