Имеет ли значение, является ли закрытый вложенный класс статическим или нет? - PullRequest
0 голосов
/ 19 октября 2019

Я немного запутался. Во время чтения Java-учебника вопрос "проснись" для меня. Если я решил, что вложенный класс должен быть с модификатором частного доступа, имеет ли значение (вообще), будет ли вложенный класс статическим или нет? Сначала я думал, что это не имеет значения, но после написания некоторых классов, чтобы проверить свою интуицию, я нашел несколько разных «результатов» при запуске программы с ключевым словом «static» и без него.

Следующий код не имеет значенияскомпилируйте, получите следующую ошибку компиляции: «Нестатический метод callByInnerClass () не может быть указан из статического контекста»

public class Outer
{
    private String outerString = "nnnn";
    private InnerStatic iS;
    public void createInnerClassInstance()
    {
        iS = new InnerStatic("innter"); 
    }


    public void runInnerMethod()
    {
        iS.callInnerMethod();
    }

    // if method runs it mean the inner static class can run outer methods

    public String calledByInnerClass()
    {
        System.out.println("Inner class can call Outer class non static method");
        System.out.println("nn value after ruuning inner class is: " +outerString );
    }

    public static class InnerStatic
    {
        public String innerString;

        public InnerStatic(String str)
        {
            innerString = str;
        }

        public void callInnerMethod()
        {
            System.out.println(innerString);
            outerString  = "aaa";
            calledByInnerClass();
        }

    }
}

При удалении ключевого слова «static» перед внутренним классом программа компилируется успешно. По какой причине, когда существует ключевое слово «static», вложенный класс не может найти свой экземпляр внешнего класса (и считается внутренним)? Я читал, что при создании из другого класса объекта внутреннего класса, у внутреннего класса автоматически появляется экземпляр внешнего класса, но эта ситуация выглядит немного иначе

1 Ответ

0 голосов
/ 19 октября 2019

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

...