我想创建一个类ClassB
作为ClassA
的内部类,但我想在ClassA.java
文件外写下来。
我该怎么做?
这将是很多内部类,ClassA.java
文件将巨大。
更新
我真正想要做的是定义十个类,它们只能由一个类访问。所有这些都在同一个包中定义。
感谢。
答案 0 :(得分:13)
简单的答案是,不,你不能。
由于是内部类,该类必须在父类的范围内。
如果你的课程确实非常庞大,那么它可能会说明你班级的设计。你正在正确使用封装吗?
答案 1 :(得分:8)
将所有类放在一个包中,并将类定义为包私有。
package com.example.here
class Hello{
//...
}
注意缺少关键字public
?如果创建它的类在com.example.here
包中,您将只能创建Hello类的实例。
答案 2 :(得分:2)
UPDATE
我真正想要做的是定义十个类,它们只能由一个类访问。所有这些都在同一个包中定义。
如果要限制对单个类的访问,可以将它们全部放在新包中。您还需要将允许访问的指定类移动到此包中。对于新类,您可以使用默认访问级别(无public
/ private
/ protected
修饰符)来限制访问权限。这将使它们只能访问其包中的类。允许访问的指定类可以公开,以便可以在此新包之外使用它。
注意:您可以选择限制类的可见性或构造函数的可见性。
答案 3 :(得分:1)
class Outer {
class SomeInnerClass extends SomeClass {
// More specific code here
}
}
class SomeClass {
// A lot of generic code here (in a different file)
}
使用内部类的一个(更正确的)原因通常与使用外部类的确切实例有关。要在基类中以通用方式处理它,请使用抽象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;
}
}
}
我认为你明白了这一点......你也可以考虑使用一些GeneralData
类或接口(在SomeClass
内),让getSpecificData()
返回更具体的(下降) - )它的实例。
再说一遍:这可能会非常误用于创建非常糟糕的不可读代码,但它也可以在适当的情况下用于非常好的模式,无论如何它应该回答原始问题。