我是java新手,一直在理解它的概念。 我正在关注教程Java tutorial。但是,我找不到使用静态嵌套类的有用性。我的意思是我认为我需要一些很好的例子来说明我为什么要使用它。有人可以提供一些代码作为示例,以便我能更好地理解它吗? thax
答案 0 :(得分:3)
静态嵌套类相对于“普通”类的好处是可以使用它来反映两个类之间的关系。
例如,在JDK中有java.util.Map
和java.util.Map.Entry
。
java.util.Map.Entry
被声明为public static interface
,并以此方式明确指出其与Map
的关系。它可以被定义为java.util.MapEntry
,但是作为静态嵌套接口,它可以清楚地表明它与Map
有很强的关系。
因此,当嵌套类只能在其父级的上下文中使用时,您可能只使用静态嵌套类。
答案 1 :(得分:1)
以下示例可能不适用于Java初学者,但是当您希望使用Builder pattern构造外部类的不可变对象时,静态嵌套类的一个很好的示例。允许静态嵌套类访问外部类的私有成员,从而构造外部类的对象,尽管它具有私有构造函数并初始化外部类的私有字段。 E.g。
public class SomeClass {
private int someField;
private int someOtherField;
private SomeClass()
{}
public static class SomeBuilder {
private int someField;
private int someOtherField;
public SomeBuilder setSomeField(int someField)
{
this.someField = someField;
return this;
}
public SomeBuilder setSomeOtherField(int someOtherField) {
this.someOtherField = someOtherField;
return this;
}
public SomeClass build() throws ValidationException
{
validateFields();
SomeClass someClass = new SomeClass();
someClass.someField = someField;
someClass.someOtherField = someOtherField;
return someClass;
}
private void validateFields() throws ValidationException {
//Validate fields
}
}
public int getSomeField() {
return someField;
}
public int getSomeOtherField() {
return someOtherField;
}
}
答案 2 :(得分:0)
嵌套或内部类只是定义到其他类的普通类。这样做的原因通常是将内部类隐藏起来,即它是另一个封装级别。
内部类可以是private,protected和public,与字段和方法完全相同。
如果内部类不是私有的,您也可以从外部访问它。它的名字是OuterClass.InnnerClass
。嵌套深度不受Java规范的限制,因此内部类可以有自己的内部类等。
如果内部类不是静态的,它还有另一个特性:能够调用外部的类方法和字段。
内部类也可以是匿名的。这对于小回调,事件处理程序等非常有用。
希望这会有所帮助。不要犹豫,提出其他更具体的问题。
答案 3 :(得分:0)
我应该添加的另一件事是,如果内部类不是静态,它的实例将自动具有对其父类实例的引用。您可以使用:NameOfOuterClass.this
来引用它。
但如果 是静态的,那么它就不会。
除此之外,这在GC(垃圾收集)期间发挥作用。 因为,如果内部类的对象没有被GCed,那么它引用的外部类对象也不会被GC(在内部类不是静态的情况下)。