Java:静态与内部类

静态和非静态内部类有什么区别?

根据定义 ,内部类不能是静态的,所以我将把你的问题重新定义为“静态和非静态嵌套类之间有什么区别?

一个非静态的嵌套类可以完全访问它所嵌套的类的成员。 静态嵌套类没有对嵌套实例的引用,所以静态嵌套类不能调用非静态方法或访问嵌套类的实例的非静态字段。

让我们看看这些问题的智慧之源: Joshua Bloch的Effective Java

从技术上讲,没有一个静态的内心阶层。 根据Effective Java ,正确的术语是一个静态嵌套类 。 一个非静态的嵌套类实际上是一个内部类,以及匿名类和本地类。

现在引用:

非静态[嵌套]类的每个实例隐式地与其包含类的封闭实例关联…可以调用封闭实例上的方法。

静态嵌套类不能访问封闭的实例。 它使用更less的空间。

静态内部类和非静态内部类有两个区别。

  1. 在声明成员字段和方法的情况下,非静态内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态的字段和方法。

  2. 非静态内部类的实例是通过外部对象的引用创build的,它定义了外部类,这意味着它包含了实例。 但是静态内部类的实例创build时没有Outer类的引用,这意味着它没有包含实例。

看到这个例子

 class A { class B { // static int x; not allowed here } static class C { static int x; // allowed here } } class Test { public static void main(String… str) { A a = new A(); // Non-Static Inner Class // Requires enclosing instance AB obj1 = a.new B(); // Static Inner Class // No need for reference of object to the outer class AC obj2 = new AC(); } } 
  1. 静态内部类不能访问封闭类的非静态成员。 它可以直接访问封闭类的静态成员(实例字段和方法),就像获取值的过程风格一样,不需要创build对象。

  2. 静态内部类可以声明静态和非静态成员。 静态方法可以访问主类的静态成员。 但是,它不能访问非静态的内部类成员。 要访问非静态内部类的成员,必须创build非静态内部类的对象。

  3. 非静态内部类不能声明静态字段和静态方法。 它必须在静态或顶级types中声明。 这样做会导致这个错误,说“静态字段只能在静态或顶级types中声明”。

  4. 非静态内部类可以获取值的过程样式访问封闭类的静态和非静态成员,但不能访问静态内部类的成员。

  5. 封闭类不能访问内部类的成员,直到它创build一个内部类的对象。 IF主类在访问非静态类的成员时可以创build非静态内部类的对象。

  6. 如果主类访问静态内部类的成员有两种情况:

    • 情况1:对于静态成员,可以使用静态内部类的类名
    • 情况2:对于非静态成员,可以创build静态内部类的实例。

讨论嵌套类…

不同之处在于也是静态的嵌套类声明可以在封闭类之外实例化。

当你有一个静态的嵌套类声明时,除了通过封闭类,Java不会让你实例化它。 内部类创build的对象链接到从外部类创build的对象,所以内部类可以引用外部的字段。

但是,如果它是静态的,那么链接不存在,外部字段不能被访问(除了像任何其他对象那样通过普通的引用),因此你可以自己实例化嵌套类。

一个内部类不能是静态的,所以我将重写你的问题,“静态和非静态嵌套类有什么区别?”。

正如你在这里所说的内部类不能是静态的…我发现下面的代码正在被赋予静态….原因? 或者是正确的….

是的,在静态嵌套types的语义中没有任何东西可以阻止你这样做。 这段代码运行良好。

  public class MultipleInner { static class Inner { } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Inner(); } } } 

这是在这个网站上发布的代码…

对于问题—>一个静态嵌套类可以多次实例化?

答案是—>

现在,嵌套types当然可以做自己的实例控制(例如私有构造函数,单例模式等),但是这与嵌套types无关。 此外,如果嵌套types是一个静态枚举,当然你不能实例化它。

但总的来说,是的,一个静态的嵌套types可以被多次实例化。

请注意,从技术上讲,静态嵌套types不是“内部”types。

静态内部类:可以声明静态和非静态成员,但只能访问父类的静态成员。

非静态内部类:只能声明非静态成员,但可以访问其父类的静态和非静态成员。

静态嵌套类与其他类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是嵌套在另一个顶级类中的顶级类,以便于打包。