我在我的Java类的内部类。
当我运行发现错误 ,它建议(警告),使其为静态。
这是什么警示意义? 什么是制作内部类静态的优势在哪里?
我在我的Java类的内部类。
当我运行发现错误 ,它建议(警告),使其为静态。
这是什么警示意义? 什么是制作内部类静态的优势在哪里?
如果嵌套类没有访问封闭类的变量的任何,它可以制成静态的。 这样做的好处是,你不需要在外部类的类实例使用嵌套类。
一个内部类,默认情况下,具有与外类的对象的隐式引用。 如果从外部类的代码实例化一个这样的对象,这是所有为你做。 如果你不这样做,你需要自己提供的对象。
静态内部类不具备这一点。
这意味着它可以在一个外部类对象的范围之外进行实例化。 这也意味着,如果你“出口”的内部类的一个实例,它不会阻止被收集当前对象。
作为一个基本规则,如果内部类没有理由访问外一个,你应该让静态的默认。
非静态内部类具有外部类的隐式引用。 如果你把班级为静态的,你可以节省一些内存和代码。
静态内部类是语义上更简单的事情。 这就像一个顶级类,除非你有知名度更多的选择(例如,你可以把它私有的)。
为了避免非静态内部类的一个重要原因是,它们更复杂。 有隐藏的参考外部类(甚至超过一个)。 并在内部类的方法的简单名称现在可以是以下三种情况之一:一个本地的,一个字段,或外部类的字段。
这种复杂的赝像的是隐藏的参考外类可以导致内存泄漏。 说内部类是一个监听器,并可能是一个静态内部类。 只要注册该侦听器,它保存到外部类,这又可以保持到大量的存储器的实例的引用。 使听者静电会允许垃圾回收外实例。
我们已经有了很好的答案,这里是我5毛钱:
既,当我们需要分离尚未使用的方法和外部类的变量的逻辑功能静态和非静态内部类被使用。 无论是内部类可以访问外部类的私有变量。
静态内部类的优点: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();
}
}
静态内部类的官方Java文档可以在这里找到https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html