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

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

1 голос
/ 23 апреля 2010

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

При реализации внутреннего класса, нужно ли мне объявлять его атрибуты и методы, то есть public, private, protected?

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

Ответы [ 4 ]

3 голосов
/ 23 апреля 2010

Если хотите.

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

2 голосов
/ 23 апреля 2010

при реализации внутреннего класса нужно ли мне объявлять его атрибуты и методы, т.е. public, private, protected?

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

public class Example1
{
    int a;

    public class Example2
    {
    int b;

    void test () {}
    }
}

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

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

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

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

2 голосов
/ 23 апреля 2010

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

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

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

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

0 голосов
/ 23 апреля 2010

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

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

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

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

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

Разница в Google.

...