在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的回答)
- 在最罕见的情况下,最好使用内部类,同时让它们在其他地方工作。如果这真的是你,请继续阅读
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;
}
}
}