Java静态与非静态嵌套类

示例

创建嵌套类时,您可以选择使该嵌套类静态:

public class OuterClass1 {

    private static class StaticNestedClass {

    }

}

还是非静态的:

public class OuterClass2 {

    private class NestedClass {

    }

}

从本质上讲,静态嵌套类没有外部类的周围实例,而非静态嵌套类则具有。这将影响允许在何时何处实例化嵌套类,以及允许访问这些嵌套类的哪些实例。添加到以上示例:

public class OuterClass1 {

    private int aField;
    public void aMethod(){}

    private static class StaticNestedClass {
        private int innerField;

        private StaticNestedClass() {
             innerField = aField; //非法,无法从静态上下文访问aField 
             aMethod();           //非法,无法从静态上下文调用aMethod 
        }

        private StaticNestedClass(OuterClass1 instance) {
             innerField = instance.aField; //Legal
        }

    }

    public static void aStaticMethod() {
        StaticNestedClass s = new StaticNestedClass(); //合法的,能够在静态环境中构建
        //做涉及...的事情
    }

}

public class OuterClass2 {

    private int aField;

    public void aMethod() {}

    private class NestedClass {
        private int innerField;

        private NestedClass() {
             innerField = aField; //Legal   
             aMethod(); //Legal
        }
    }

    public void aNonStaticMethod() {
        NestedClass s = new NestedClass(); //Legal
    }

    public static void aStaticMethod() {
        NestedClass s = new NestedClass(); //非法。没有周围的OuterClass2实例就无法构建。
                                         //由于这是一个静态上下文,因此没有周围的OuterClass2实例
    }
}

因此,您决定使用静态还是非静态方法主要取决于是否需要直接访问外部类的字段和方法,尽管这也会影响何时以及在何处构造嵌套类。

根据经验,除非需要访问外部类的字段和方法,否则将嵌套类设为静态。与将字段设为私有(除非您需要将其设为公开)相似,这会减少嵌套类的可见性(通过不允许访问外部实例),从而减少了出错的可能性。