在java文件外定义内部类

在java文件外定义内部类,java,inner-classes,Java,Inner Classes,我想创建一个类,ClassB,作为ClassA的内部类,但我想写在ClassA.java文件之外 我该怎么做 它将是大量的内部类,ClassA.java文件将是巨大的 更新 我真正想做的是定义十个类,它们只能由一个类访问。它们都是在同一个包中定义的 谢谢。简单的答案是:不,你不能 由于是一个内部类,该类必须在父类的范围内 如果你的课程真的非常庞大,那么它可能会说明你的课程设计。您是否正确使用了封装 更新 我真正想做的是定义十个类,它们只能由一个类访问。它们都是在同一个包中定义的 如果要限制对单个

我想创建一个类,
ClassB
,作为
ClassA
的内部类,但我想写在
ClassA.java
文件之外

我该怎么做

它将是大量的内部类,
ClassA.java
文件将是巨大的

更新
我真正想做的是定义十个类,它们只能由一个类访问。它们都是在同一个包中定义的


谢谢。

简单的答案是:不,你不能

由于是一个内部类,该类必须在父类的范围内

如果你的课程真的非常庞大,那么它可能会说明你的课程设计。您是否正确使用了封装

更新
我真正想做的是定义十个类,它们只能由一个类访问。它们都是在同一个包中定义的

如果要限制对单个类的访问,可以将它们全部放在一个新包中。您还需要将允许访问的指定类移动到此包中。对于新类,您可以使用默认访问级别(no
public
/
private
/
protected
修饰符)来限制访问。这将使它们仅对其包中的类可访问。允许访问的指定类可以公开,以便可以在此新包外部使用


注意:您可以选择限制类的可见性或构造函数的可见性。

将所有类放在一个包中,并将类定义为包专用类

package com.example.here

class Hello{
    //...
}
注意缺少关键字
public
?如果创建类Hello的类位于
com.example.here
包中,则只能创建该类Hello的实例。

请尝试以下操作。。。
  • 将外部类的引用移交给不再是内部类的引用
  • 使用包并使内部类包不再私有(Jeremy的回答)
  • 在最罕见的情况下,最好使用内部类,同时让它们在其他地方工作。如果这真的是你,请继续阅读
如何保持内部类的小型化 a) 从外部类扩展 b) 使用抽象的方法 使用内部类的一个(更正确的)原因通常与使用外部类的确切实例有关。要在基类中以通用方式处理它,请使用抽象getter

abstract class SomeClass {

    protected abstract SpecificData getSpecificData();

    void someMethod() {
        SpecificData specificData = getSpecificData();

        // Do work with the "specific data" here ...
    }
}


class Outer {

    private SpecificData mSpecificData = new SpecificData();

    class SomeInnerClass extends SomeClass {

        @Override
        protected SpecificData getSpecificData() {
            return OuterClass.mSpecificData;
        }
    }
}
我想你明白了。。。您也可以考虑使用一些<代码>通用数据< /COD>类或接口(在<代码> SomeClass < /COD>)中,并具有<代码> GeEngutoDATA()/<代码>返回一个更具体的(下降的)实例。
再次强调:这可能被严重误用以创建非常糟糕的不可读代码,但在正确的情况下,它也可以用于非常好的模式,无论如何,它应该回答最初的问题。

通常我不喜欢告诉OP他们做错了,但在这种情况下,也许一点上下文会有所帮助?定义“许多”内部类通常不是一个好主意。我真正想做的是定义十个类,它们只能由一个类访问。所有这些类都是在同一个包中定义的。如果是这样,您可以将所有10个类都定义为包私有类。也就是说,不要使用
公共类Hello
,而是使用
类Hello
。这将使得只有包中的类才能访问它们。
内部
类被定义为非静态的嵌套类。除了在另一个类中之外,没有其他方法来定义它们。另一方面,如果您真正指的是嵌套类,那么您所要求的是微不足道的。我真正想做的是定义十个类,它们只能由一个类访问。它们都是在同一个包中定义的。您需要将所有类包含在一个包中,并将类扩展到包的范围内,这样就不能在包之外访问它们。移动包不是一个好的解决方案,它会限制包中的使用。如果问题是没有人关心的一次拍摄计划,那么这可能是一个很好的解决方案。
abstract class SomeClass {

    protected abstract SpecificData getSpecificData();

    void someMethod() {
        SpecificData specificData = getSpecificData();

        // Do work with the "specific data" here ...
    }
}


class Outer {

    private SpecificData mSpecificData = new SpecificData();

    class SomeInnerClass extends SomeClass {

        @Override
        protected SpecificData getSpecificData() {
            return OuterClass.mSpecificData;
        }
    }
}