Java: Почему мы можем определить класс верхнего уровня как закрытый? - PullRequest
46 голосов
/ 16 декабря 2009

Почему Java позволяет объявить класс верхнего уровня как закрытый? Есть ли другая причина, кроме «Мы не можем получить доступ к закрытому классу»?

Ответы [ 11 ]

68 голосов
/ 16 декабря 2009

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

25 голосов
/ 16 декабря 2009

Java не позволяет классу верхнего уровня быть закрытым. Только 'public' или 'package'.

10 голосов
/ 04 февраля 2013

Я думаю, что лучший вопрос будет:

Что будет означать, что класс высшего уровня будет закрытым?

Если вы думаете с точки зрения уровней доступа, уровень над классом - это пакет. На самом деле вы можете иметь частные классы верхнего уровня в Java! Извлечение из Oracle (ранее Sun) учебных пособий по Java :

Если у класса нет модификатора (по умолчанию, также известного как package-private), он виден только внутри своего собственного пакета (пакеты называются группами связанных классов - вы узнаете о них на следующем уроке.)

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

8 голосов
/ 16 декабря 2009

Теоретически, вы можете создавать экземпляры и вызывать методы для класса private верхнего уровня (если такая вещь разрешена языком ... , что это не так! ), но вы пришлось бы использовать отражение, чтобы сделать это. Разумно (IMO) Sun решила, что частные классы верхнего уровня не очень хорошая вещь для поддержки на уровне языка.

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


UPDATE - Фактически, текущая спецификация JVM проясняет, что бит ACC_PRIVATE слова флагов доступа для класса «зарезервирован для будущего использования» и что Java реализации должны рассматривать это как неустановленное. Таким образом, приведенное выше предположение является спорным для любой JVM, которая строго реализует текущую спецификацию.

5 голосов
/ 26 августа 2013

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

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

4 голосов
/ 08 января 2014

Мы не можем объявить внешний класс как закрытый. Точнее мы не можем использовать спецификатор приватного доступа с внешним классом. Как только вы попытаетесь использовать частный спецификатор доступа с классом, вы получите сообщение об ошибке в Eclipse, в котором в качестве модификатора доступа с классом может использоваться только public, final, abstract.

Делать класс закрытым не имеет никакого смысла, так как мы не можем получить доступ к коду его класса снаружи.

2 голосов
/ 06 декабря 2012

Не было бы никакого доступа к этому классу или его членам.

1 голос
/ 03 декабря 2018

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

Так что же произойдет, если мы определим класс private, этот класс будет доступен только внутри сущности, в которой он определен, который в нашем случае является его пакетом?

Рассмотрим ниже пример класса А

package com.example;
class A {
    private int a = 10;

    // We can access a private field by creating object of same class inside the same class
    // But realy no body creates object of a class inside the same class
    public void usePrivateField(){
        A objA =  new A();
        System.out.println(objA.a);
    }
}

Поле "a" объявлено как закрытое внутри класса "A", и из-за этого поле "a" становится приватным для класса "A" и может быть доступно только внутри "A". Теперь давайте предположим, что нам разрешено объявить класс «A» как закрытый, поэтому в этом случае класс «A» станет частным для пакета «com.example» и не будет доступен извне пакета.

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

Вы можете прочитать больше в моей статье Почему внешний класс Java не может быть закрытым или защищенным .

1 голос
/ 15 мая 2018

Модификатор доступа private является наиболее ограничивающим модификатором доступа. Члены класса, определенного с помощью модификатора доступа private, доступны только им самим. Неважно, является ли рассматриваемый класс или интерфейс из другого пакета или он расширен, члены класса private недоступны вне класса, в котором они определены. закрытые члены доступны только для классов и интерфейсов, в которых они определены. Так что толкует private Outer-класс, когда его нельзя использовать ни для чего. Очевидно, это не может быть использовано как начальный класс, верно? См. Изображение ниже для более подробной информации о модификаторах доступа Java.

Java Access Modifiers

1 голос
/ 28 января 2017

Это требует простого понимания того, почему не требуется объявлять классы как частные в Java. Если ваш класс сам по себе является отдельной программой / программным обеспечением (что весьма маловероятно), то вы уже определили бы его в проекте и конкретном пакете для него. Поэтому добавление частного ключевого слова является излишним. Если это не так, то доступ по умолчанию - это значит, что ваша программа / программное обеспечение зависит от запуска различных классов. Если мы объявляем один класс среди них как закрытый (в случае, если можем), мы ограничиваем его доступность другими классами и т. Д., Что бесполезно. Это просто означает, что класс, объявленный нами как закрытый, бесполезен для запуска кода. Что снова делает его бесполезным. Если вы имеете в виду доступ на уровне пакета, то для доступа по умолчанию нам не нужно объявлять какое-либо ключевое слово перед ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...