Внутренние классы Java

Я новичок в Java и у меня есть следующий вопрос относительно внутренних классов:

Нужно ли при реализации внутреннего класса объявлять область его атрибутов и методов, т. е. публичную, частную, защищенную?

РЕДАКТИРОВАТЬ: при отсутствии делегатов (как в С#) может ли кто-нибудь упомянуть, как лучше всего реализовать систему обмена сообщениями на Java, которая обеспечивает связь между несколькими формами (Jframe)?

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


person iTEgg    schedule 23.04.2010    source источник
comment
java.sun.com/docs/books/tutorial/java/ javaOO/nested.html   -  person JRL    schedule 23.04.2010


Ответы (5)


Если хотите.

Внутренний класс, грубо говоря, подобен любому другому классу. (За исключением того, что если вы не объявите его статическим, он будет иметь ссылку EnclosingClass.this.)

person aioobe    schedule 23.04.2010
comment
Возможно, это больше похоже на ссылку EnclosingClass.this? - person jjujuma; 23.04.2010

Я бы предложил рассматривать внутренние классы как private.

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

С точки зрения интерфейса, класс со странными внутренними типами выглядит немного странно. И еще сложнее проверить, если вы увлекаетесь подобными вещами. Слишком часто создаются вложенные типы, потому что создание нового файла в плохой IDE — это немного больно — не поддавайтесь искушению неприятными ярлыками.

Сказав, что внутренние классы очень полезны. Используйте их со вкусом.

person Tom Hawtin - tackline    schedule 23.04.2010

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

Это полностью зависит от того, как вы хотите, чтобы внутренний класс вел себя. По умолчанию внутренний класс нестатичен:

public class Example1
{
    int a;

    public class Example2
    {
    int b;

    void test () {}
    }
}

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

Поскольку экземпляр нестатического внутреннего класса имеет связанный экземпляр внешнего класса, методы внутреннего класса могут напрямую обращаться к любому члену (полям или методам) экземпляра внешнего класса. Например, метод тестирования, определенный выше, может напрямую обращаться как к a, так и к b.

Класс, определенный внутри другого класса, называется вложенным классом. Как и другие члены класса, вложенный класс может быть объявлен статическим или нет. Нестатический вложенный класс называется внутренним классом. Экземпляр внутреннего класса может существовать только внутри экземпляра окружающего его класса и имеет доступ к членам окружающего его класса, даже если они объявлены закрытыми. В следующей таблице показаны типы вложенных классов:

Типы вложенных классов Тип Область действия Внутренний статический член вложенного класса нет внутренний [нестатический] член класса да локальный класс локальный да анонимный класс только в той точке, где он определен да

person gmhk    schedule 23.04.2010
comment
возможно, вам следует указать источник скопированного текста: java.sun .com/docs/books/tutorial/java/javaOO/summarynested.html - person echox; 23.04.2010

Хотя это не ответ на ваш вопрос, но убедитесь, что вы знаете о «статическом» модификаторе внутренних классов.

public class Stuff {
public static class SubStuff {
    //private or protected
}
}

Отличается от этого:

public class Stuff {
public class SubStuff {
    //only private
}
}

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

Гуглите разницу.

person Adam Gent    schedule 23.04.2010

Inner может быть виден только окружающему классу. В основном он используется для достижения полезной функции внутри класса. Давайте использовать дверь и пароль в качестве примера.

public class Door {

public boolean isPassword(String key) {
    
    //local inner class - its hidden from the world
    class Password{
        public boolean isPassword(String key) {
            if(!key.equals("xyz")) {
                System.out.println("Not Password. Door is locked");
                return false;
            }else {
                System.out.println("Password corect. Door is opened");
            return true;
            }
        }
    }
    return new Password().isPassword(key);
}

}

person karto    schedule 02.11.2020