Подтвердить что ты не робот

Какое преимущество создания внутреннего класса как статического с Java?

У меня есть внутренний класс в моем классе Java.

enter image description here

Когда я запустил найти ошибки, он рекомендует (предупреждает), чтобы сделать его статичным.

enter image description here

В чем смысл этого предупреждения? Какое преимущество создания внутреннего класса как статического?

4b9b3361

Ответ 1

Если вложенный класс не имеет доступа к какой-либо из переменных охватывающего класса, он может быть сделан статическим. Преимущество этого заключается в том, что для использования вложенного класса вам не нужен внешний экземпляр внешнего класса.

Ответ 2

Внутренний класс по умолчанию имеет неявную ссылку на объект внешнего класса. Если вы создаете экземпляр объекта из кода внешнего класса, все это делается для вас. Если вы в противном случае, вам нужно предоставить объект самостоятельно.

У статического внутреннего класса этого нет.

Это означает, что он может быть создан за пределами внешнего объекта класса. Это также означает, что если вы экспортируете экземпляр внутреннего класса, это не будет препятствовать собиранию текущего объекта.

В качестве основного правила, если у внутреннего класса нет причин для доступа к внешнему, вы должны сделать его статическим по умолчанию.

Ответ 3

Нестатический внутренний класс имеет неявную ссылку на внешний класс. Если вы сделаете класс статичным, вы можете сохранить некоторую память и код.

Ответ 4

Статический внутренний класс - семантически более простая вещь. Это похоже на класс верхнего уровня, за исключением того, что у вас есть больше возможностей для видимости (например, вы можете сделать его закрытым).

Важной причиной избежать нестатических внутренних классов является то, что они более сложны. Существует скрытая ссылка на внешний класс (возможно, даже более одного). И простое имя в методе внутреннего класса теперь может быть одним из трех: локальным, полем или полем внешнего класса.

Артефактом этой сложности является то, что скрытая ссылка на внешний класс может привести к утечкам памяти. Скажем, внутренний класс является слушателем и может быть статическим внутренним классом. Пока слушатель зарегистрирован, он содержит ссылку на экземпляр внешнего класса, который, в свою очередь, может содержать большие объемы памяти. Создание статичного слушателя может позволить внешнему экземпляру собирать мусор.

Ответ 5

У нас уже есть хорошие ответы, вот мои 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

Ответ 6

Преимущества статических внутренних классов: 1. Создание статического внутреннего класса не зависит от указаний внешнего класса и затрат памяти на создание экземпляров 2. Статический внутренний класс не содержит указаний внешнего класса, не влияет на сбор внешнего класса, чтобы избежать расширение внешнего класса во времени выживания памяти, приводящее к утечке памяти