2012-06-23 4 views
2

Я пытаюсь создать проект с пакетами классов с различными модификаторами доступа, чтобы увидеть все характеристики классов с различными модификаторами доступа. Я попробовал иметь пакет с открытым классом, один с классом по умолчанию, а затем попытался иметь 2 других для защищенных и частных классов, но он сказал: «Недопустимый модификатор для класса privatez, для них разрешены только публичные, абстрактные & final». Почему это так. А во-вторых, проверяет материал для каждого класса - хороший способ его понять. Я пытаюсь дать лучший вопрос, чем предыдущий пост. Я также хочу изучить применение каждого модификатора доступа.Практические модификаторы доступа

+0

возможно дубликат [Practice доступа Модификаторы] (http://stackoverflow.com/questions/11165566/practice-access-modifiers) –

+1

@AnthonyPegram Я сделал это в лучший вопрос и на самом деле объяснил, что я интересовался. Это не повторение. –

ответ

5

Я попытался имея пакет с общественным классом, один с классом по умолчанию, а затем попытался иметь 2 другие охраняемые и частные классы, но он сказал: «Illegal модификатора для класса privatez, только общественности, абстрактный & финала разрешены "для них. Почему это так.

Простой ответ: JLS говорит, что вы не можете объявить класс верхнего уровня как private.

Причина в том, что не имеет смысла иметь класс, который является только видимым для себя. Нет никакого способа, чтобы какой-либо другой класс когда-либо мог его использовать (отдельно, предположительно, от использования грязных трюков с отражением). Поэтому JLS просто говорит: «Это не имеет смысла, и я не разрешаю».

(Теперь вложенная класс может иметь доступ private ... но это потому, что privateprivate означает для всех классов в самых крайних классов ограждающих ...)

А во-вторых, это тестирование материал для каждого класса - хороший способ понять это.

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


Для этого примера:

package privatez; protected class privatez { } 

Гипотетический protected класс будет/может быть видна его подклассами только. Но классы всегда видны их подклассам, поэтому это не имеет никакого смысла. (Кроме того, способ предотвратить подклассы, чтобы объявить класс final, и вы можете ограничить подклассы с помощью «частного пакета», т.е. без модификатора доступа.)

Модификатор protected доступа только имеет смысл для вещей внутри в класс. В классе верхнего уровня нормальный смысл protected не имеет никакого смысла.

(Это одна из проблем, связанных с попытками научиться на примерах. В итоге вы пытаетесь понять, почему компилятор отвергает примеры. Не ожидайте, что компилятор «объяснит», почему что-то не так. Это не его роль .)

+1

, но защищенный класс может быть видимым для подкласса за пределами того же пакета, поэтому не стоит делать его защищенным. –

+0

Мне нужно будет увидеть точный код, который вы написали/скомпилировали, чтобы ответить на этот вопрос. И точное сообщение об ошибке компиляции. –

+0

+1 Скажите, есть ли концепция защищенного класса, тогда этот класс будет виден подклассам в том же пакете, и это так, если вы не определяете какой-либо модификатор. – havexz

3

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

Модификаторы доступа Класс:

общественного

Класс может быть доступ за пределами пакета он является частью.

по умолчанию

Это когда вы не указать любую вещь. Класс доступен из с в пакете, он является частью.

Просто для уточнения:

private модификатор не имеет смысла. Поскольку никто не может получить доступ к закрытому классу, ни для расширения, ни для создания экземпляра.

Скажите, существует ли концепция класса protected, тогда этот класс будет виден подклассам в том же пакете, и это случай, если вы не определяете какой-либо модификатор.

Другие Атрибуты класса (это не доступ модификаторов):

абстрактные

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

окончательный

Если определено, пользователь не может расширить этот класс.

For more details about java as language read