为什么在Java中使用静态嵌套类?

为什么在Java中使用静态嵌套类?,java,oop,Java,Oop,我是java新手,对java的一些概念还不太了解。 我正在学习教程。但是,我找不到使用静态嵌套类的用处。我的意思是,我想我需要一些好的例子来说明我为什么要使用它。有人能给我提供一些代码作为例子,让我更好地理解它吗? thax嵌套或内部类只是定义到其他类中的普通类。这样做的原因通常是对其他类隐藏内部类,也就是说,它是另一个封装级别 内部类可以是私有的、受保护的和公共的,这与字段和方法的含义完全相同 如果内部类不是私有的,您也可以从外部访问它。它的名称是OuterClass.InnnerClass。

我是java新手,对java的一些概念还不太了解。 我正在学习教程。但是,我找不到使用静态嵌套类的用处。我的意思是,我想我需要一些好的例子来说明我为什么要使用它。有人能给我提供一些代码作为例子,让我更好地理解它吗?
thax

嵌套或内部类只是定义到其他类中的普通类。这样做的原因通常是对其他类隐藏内部类,也就是说,它是另一个封装级别

内部类可以是私有的、受保护的和公共的,这与字段和方法的含义完全相同

如果内部类不是私有的,您也可以从外部访问它。它的名称是
OuterClass.InnnerClass
。嵌套深度不受Java规范的限制,因此内部类可以有自己的内部类等

若内部类不是静态的,那个么它还有另一个特性:能够调用外部类的方法和字段

内部类也可以是匿名的。这对于小型回调、事件处理程序等非常有用


希望这有帮助。不要犹豫问其他更具体的问题。

嵌套类或内部类只是定义到其他类中的普通类。这样做的原因通常是对其他类隐藏内部类,也就是说,它是另一个封装级别

内部类可以是私有的、受保护的和公共的,这与字段和方法的含义完全相同

如果内部类不是私有的,您也可以从外部访问它。它的名称是
OuterClass.InnnerClass
。嵌套深度不受Java规范的限制,因此内部类可以有自己的内部类等

若内部类不是静态的,那个么它还有另一个特性:能够调用外部类的方法和字段

内部类也可以是匿名的。这对于小型回调、事件处理程序等非常有用


希望这有帮助。不要犹豫问其他更具体的问题。

静态嵌套类比“普通”类的好处在于,您可以使用它来反映两个类之间的关系

例如,在JDK中有和

java.util.Map.Entry
被声明为一个
公共静态接口
,这样做清楚地表明了它与
Map
的关系。它可以被定义为
java.util.MapEntry
,但作为一个静态嵌套接口进行操作可以清楚地表明它与
Map
有很强的关系


因此,当嵌套类只能在其父类的上下文中使用时,您可能只会使用静态嵌套类

与“普通”类相比,静态嵌套类的好处在于,您可以使用它来反映两个类之间的关系

例如,在JDK中有和

java.util.Map.Entry
被声明为一个
公共静态接口
,这样做清楚地表明了它与
Map
的关系。它可以被定义为
java.util.MapEntry
,但作为一个静态嵌套接口进行操作可以清楚地表明它与
Map
有很强的关系


因此,当嵌套类只能在其父类的上下文中使用时,您可能只会使用静态嵌套类

下面的示例可能不适合Java初学者,但静态嵌套类的一个很好的示例是当您想要使用构造外部类的不可变对象时。静态嵌套类允许访问外部类的私有成员,从而构造外部类的对象,尽管它具有私有构造函数并初始化外部类的私有字段。 例如


下面的示例可能不适合Java初学者,但静态嵌套类的一个很好的示例是当您想要使用构造外部类的不可变对象时。静态嵌套类允许访问外部类的私有成员,从而构造外部类的对象,尽管它具有私有构造函数并初始化外部类的私有字段。 例如


我应该补充的另一点是,如果内部类不是静态的,那么它的实例将自动引用其父类实例。您可以使用以下命令引用它:
NameOfOutClass。此

但如果它是静态的,那么它就不会

这在GC(垃圾收集)期间起作用。
因为,如果内部类的对象没有被GCed,那么它引用的外部类对象也不会被GCed(在内部类不是静态的情况下)。

我应该补充的另一件事是,如果内部类不是静态的,它的实例将自动引用其父类实例。您可以使用以下命令引用它:
NameOfOutClass。此

但如果它是静态的,那么它就不会

这在GC(垃圾收集)期间起作用。
因为,如果内部类的对象没有被GCed,那么它引用的外部类对象也不会被GCed(在内部类不是静态的情况下).

请看下面的内容请看下面的内容这当然是编写静态嵌套类的逻辑方法,但静态嵌套类不必了解其父类的任何信息。实际上,您可以编写一个名为“Zoo”的外部类,并拥有一个与“Zoo”类无关的“GalacticWarr”静态嵌套类。这当然是编写静态嵌套类的逻辑方法,但静态嵌套类不必知道其父类的任何信息。实际上,您可以编写一个名为“Zoo”的外部类,并拥有一个与“Zoo”类无关的“GalacticWarr”静态嵌套类。注意:静态嵌套类不能访问实例变量和非stati
    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;
    }
}