使用Java将内部类设置为静态有什么好处?

我的Java类中有一个内部类。

在此处输入图像描述

当我运行查找错误时 ,它建议(警告)使其成为静态。

在此处输入图像描述

这个警告有什么意义? 将内部类设为静态有什么好处?

如果嵌套类不访问封闭类的任何变量,则可以将其设置为静态。 这样做的好处是您不需要外部类的封闭实例来使用嵌套类。

默认情况下,内部类具有对外部类的对象的隐式引用。 如果你从外部类的代码中实例化了这个对象,那么这一切都是为你完成的。 否则,您需要自己提供对象。

静态内部类没有这个。

这意味着它可以在外部类对象的范围之外实例化。 它还意味着,如果您“导出”内部类的实例,则不会阻止收集当前对象。

作为一个基本规则,如果内部类没有理由访问外部类,则默认情况下应将其设置为静态。

非静态内部类具有对外部类的隐式引用。 如果将类设为静态,则可以节省一些内存和代码。

静态内部类是一种语义上更简单的东西。 它就像一个顶级类,除了你有更多的可见性选项(例如,你可以将其设为私有)。

避免非静态内部类的一个重要原因是它们更复杂。 有外部类的隐藏引用(甚至可能不止一个)。 现在,内部类的方法中的简单名称可能是以下三种情况之一:本地,字段或外部类的字段。

这种复杂性的工件是对外部类的隐藏引用可能导致内存泄漏。 假设内部类是一个监听器,可以是一个静态内部类。 只要监听器被注册,它就会保存对外部类的实例的引用,而外部类的实例又可以保留大量的内存。 使侦听器静态可以允许外部实例被垃圾收集。

我们已经有了很好的答案,这是我的5美分:

当我们需要使用外部类的方法和变量来分离逻辑function时,使用静态和非静态内部类。 两个内部类都可以访问外部类的私有变量。

静态内部类的优点:1)静态类可以从外部类访问静态变量2)静态类可以像对待一个独立的类一样对待

非静态内部类:1)不能使用外部类的静态成员2)不能像独立类一样对待

 public class NestedClassDemo { private int a = 100; int b = 200; private static int c = 500; public NestedClassDemo() { TestInnerStatic teststat = new TestInnerStatic(); System.out.println("const of NestedClassDemo, a is:"+a+", b is:"+b+".."+teststat.teststat_a); } public String getTask1(){ return new TestInnerClass().getTask1(); } public String getTask2(){ return getTask1(); } class TestInnerClass{ int test_a = 10; TestInnerClass() { System.out.println("const of testinner private member of outerlcass"+a+"..."+c); } String getTask1(){ return "task1 from inner:"+test_a+","+a; } } static class TestInnerStatic{ int teststat_a = 20; public TestInnerStatic() { System.out.println("const of testinnerstat:"+teststat_a+" member of outer:"+c); } String getTask1stat(){ return "task1 from inner stat:"+teststat_a+","+c; } } public static void main(String[] args){ TestInnerStatic teststat = new TestInnerStatic(); System.out.println(teststat.teststat_a); NestedClassDemo nestdemo = new NestedClassDemo(); System.out.println(nestdemo.getTask1()+"...."+nestdemo.getTask2()); } } 

从外部访问静态内部和非静态内部类:

 public class TestClass { public static void main(String[] args){ NestedClassDemo.TestInnerClass a = new NestedClassDemo().new TestInnerClass(); NestedClassDemo.TestInnerStatic b = new NestedClassDemo.TestInnerStatic(); } } 

可以在https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html找到静态内部类的官方java文档。