什么是Java中的静态嵌套类?

时间:2012-03-13 16:34:10

标签: java oop

我是java新手,一直在理解它的概念。 我正在关注教程Java tutorial。但是,我找不到使用静态嵌套类的有用性。我的意思是我认为我需要一些很好的例子来说明我为什么要使用它。有人可以提供一些代码作为示例,以便我能更好地理解它吗? thax

4 个答案:

答案 0 :(得分:3)

静态嵌套类相对于“普通”类的好处是可以使用它来反映两个类之间的关系。

例如,在JDK中有java.util.Mapjava.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(在内部类不是静态的情况下)。

相关问题