Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Java не позволяет классу верхнего уровня быть закрытым. Только "общедоступный" или "пакет".

Ответ 3

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

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

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

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

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

Ответ 4

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

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


ОБНОВЛЕНИЕ. Фактически, текущая спецификация JVM дает понять, что бит ACC_PRIVATE из флагов доступа слово для класса "зарезервировано для будущего использования", и что реализации Java должны рассматривать его как неустановленное. Таким образом, указанное предположение, является спорным для любой виртуальной машины Java, который строго реализует текущую спецификацию.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Невозможно получить доступ к этому классу или его членам.

Ответ 8

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

Ответ 9

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

Java Access Modifiers

Ответ 10

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

Так что же произойдет, если мы определим класс 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 станет частным для пакета 'com.example и не будет доступен извне пакета.

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

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

Ответ 11

Вы не можете определить класс верхнего уровня private (или что-нибудь еще, кроме публичного). Вы получите ошибку компиляции.

Something.java:6: error: modifier private not allowed here
private class Something {
        ^
1 error

У вас есть только два варианта: общедоступный или вообще нет модификатора доступа. Отключив публикацию, вы неявно ограничиваете доступ класса к пакету (aka: package-private).