Какой спецификатор доступа по умолчанию в Java?

поэтому я просто начал читать книгу Java и задавался вопросом; какой спецификатор доступа является стандартным, если ни один не указан?

12 ответов


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

Как указала mdma, это не верно для членов интерфейса, хотя, для которых по умолчанию "public".

посмотреть спецификаторы доступа Java


спецификатор по умолчанию зависит от контекста.

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

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

для членов интерфейса (полей и методов) доступ по умолчанию является открытым. Но обратите внимание, что само объявление интерфейса по умолчанию package частный.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

Если у нас есть декларация

public interface MyInterface2 extends MyInterface
{

}

классы, использующие MyInterface2, могут видеть field1 и method1 из суперинтерфейса, потому что они являются общедоступными, даже если они не могут видеть объявление самого MyInterface.


Если спецификатор доступа не задан, это доступ на уровне пакета (для этого нет явного спецификатора) для классов и членов класса. Методы интерфейса неявно общедоступны.


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

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


это зависит от того, что это такое.

  • типы верхнего уровня (то есть классы, перечисления, интерфейсы и типы аннотаций, не объявленные внутри другого типа) являются пакета-частная по умолчанию. (JLS §6.6.1)

  • в классах все члены (это означает поля, методы и объявления вложенных типов) и конструкторы являются пакета-частная по умолчанию. (JLS §6.6.1)

    • когда класс не имеет явно объявленного конструктора, компилятор вставляет конструктор нулевого аргумента по умолчанию, который имеет тот же спецификатор доступа, что и класс. (JLS §8.8.9) конструктор по умолчанию обычно неправильно указан как всегда открытый, но в редких случаях это не эквивалент.
  • в перечислениях конструкторы являются частная по умолчанию. Действительно, enum contructors должны быть частными, и это-ошибка, чтобы указать их как public или protected. Константы перечисления всегда общественные, и не разрешают никакой спецификатор доступа. Другие члены перечисления пакета-частная по умолчанию. (JLS §8.9)

  • в интерфейсах и типах аннотаций все члены (опять же, это означает поля, методы и объявления вложенных типов) являются общественные by по умолчанию. Действительно, члены интерфейсов и типов аннотаций должны быть общедоступными, и указывать их как частные или защищенные является ошибкой. (JLS §9.3-9.5)

  • локальные классы называются классами, объявленными внутри блока метода, конструктора или инициализатора. Они относятся к {..} блок, в котором они были объявлены и не разрешайте спецификатор доступа. (JLS §14.3) С помощью отражения, вы можете инстанцировать классы из других мест, и они пакета-частная, хотя я не уверен, что эта деталь находится в JLS.

  • анонимные классы-это пользовательские классы, созданные с помощью new которые указывают тело класса непосредственно в выражении. (JLS §15.9.5) их синтаксис не разрешает спецификатор доступа. Используя отражение, вы можете создавать экземпляры анонимных классов из других мест, и как они, так и их сгенерированные конструкторы являются пакета-частная, хотя я не уверен, что эта деталь находится в JLS.

  • блоки экземпляра и статического инициализатора не имеют спецификаторов доступа на уровне языка (JLS §8.6 & 8.7), но статические блоки инициализатора реализованы как метод с именем <clinit> (JVMS §2.9), поэтому метод должен внутренне иметь некоторый спецификатор доступа. Я рассмотрел классы, скомпилированные javac и компилятором Eclipse используя шестнадцатеричный редактор и обнаружил, что оба генерируют метод как пакета-частная. Однако вы не можете позвонить <clinit>() внутри языка, потому что < и > символы недопустимы в имени метода, а методы отражения запрограммированы на отрицание его существования, поэтому его спецификатор доступа нет доступа к. Метод может быть вызван только виртуальной машиной во время инициализации класса. экземпляр блоки инициализатора не компилируются как отдельные методы; их код копируется в каждый конструктор, поэтому они не могут быть доступны по отдельности, даже путем отражения.


посмотреть здесь для более подробной информации. Значение по умолчанию-не private/public / protected, а совершенно другая спецификация доступа. Он не широко используется, и я предпочитаю быть более конкретным в своих определениях доступа.


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


вот цитата о видимости уровня пакета из интервью с Джеймсом Гослингом, создателем Java:

Билл Веннерс: Java имеет четыре уровня доступа. По умолчанию пакет. Я всегда задавались вопросом, удобно ли сделать пакет access default потому что три ключевых слова, о которых люди из C++ уже знали были частными, охраняемыми и публичными. Или если вы имели определенную причина, по которой вы чувствовали, что доступ к пакету должен быть по умолчанию.

Джеймс Гослинг: пакет, как правило, набор вещей, которые являются своего рода пишется вместе. В общем, я мог бы сделать одно из двух. Одним из них было заставить вас всегда вставлять ключевое слово, которое дает вам домен. Или у меня могло быть значение по умолчанию. И тогда вопрос, что делает разумный дефолт? И я стремлюсь к тому, что является наименьшим. опасный предмет.

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

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

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

некоторое время на самом деле было дружественное ключевое слово. Но ведь все другие начинают с "П" было "phriendly" с "РН." Но это было только там, может быть, на день.

http://www.artima.com/intv/gosling2P.html


обновление Java 8 использование default ключевое слово: Как и многие другие отметили видимость по умолчанию (без ключевого слова)

поле будет доступно изнутри того же пакета, к которому класс принадлежит.

Не путать с новым Java 8 функция (Методы По Умолчанию), который позволяет интерфейсу предоставлять реализацию, когда он помечен default ключевое слово.

посмотреть: модификаторы доступа


в JAVA есть модификатор доступа, называемый "default", который позволяет создавать прямой экземпляр этой сущности только в этом пакете.

вот полезная ссылка:

Модификаторы/Спецификаторы Доступа Java


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

на общественные ключевое слово используется во многих объектно-ориентированных языках программирования (OOPL), включая C++, Java, C# и Visual Basic.NET (VB.NET). Публичный член слабо связан с классом и менее ограничен, чем частный член. Переменные или поля, объявленные общедоступными, не имеют ограничений доступности. Частный член, однако, виден только в своем классе.

модификатором доступа public Поля, методы и конструкторы, объявленные открытыми (наименее ограничительными) внутри открытого класса, видны любому классу В программе Java, находятся ли эти классы в том же пакете или в другом пакете.

другие модификаторы доступа

  1. частная
  2. защищенный
  3. по умолчанию

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

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

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

на Java, что если класс, как без модификатора?

если класс не имеет модификатора доступа, он будет обработан в разделе модификатор доступа по умолчанию.

в объектно-ориентированных языках программирования инкапсуляция используется для обозначения одного из двух связанных, но разных понятий, а иногда и их комбинации:

языковой механизм для ограничения прямого доступа к некоторым компонентам объекта Языковая конструкция, облегчающая связывание данных с методами (или другими функциями), работающими на этом данные.

//Java program to illustrate default modifier
package p1;

//Class Geeks is having Default access modifier
class Geek
{
    void display()
       {
           System.out.println("Hello World!");
       }
}

..

//Java program to illustrate error while 
//using class from different package with
//default modifier
package p2;
import p1.*;

//This class is having default access modifier
class GeekNew
{
    public static void main(String args[])
       {  
          //accessing class Geek from package p1
          Geeks obj = new Geek();

          obj.display();
       }
}

..

 //Java program to illustrate error while 
//using class from different package with
//private modifier
package p1;

class A
{
   private void display()
    {
        System.out.println("GeeksforGeeks");
    }
}

class B
{
   public static void main(String args[])
      {
          A obj = new A();
          //trying to access private method of another class
          obj.display();
      }
}

..

 //Java program to illustrate
    //protected modifier
    package p1;

//Class A
public class A
{
   protected void display()
    {
        System.out.println("GeeksforGeeks");
    }
}


    //Java program to illustrate
    //protected modifier
    package p2;
    import p1.*; //importing all classes in package p1

    //Class B is subclass of A
    class B extends A
    {
       public static void main(String args[])
       {  
           B obj = new B();  
           obj.display();  
       }  

    }

..

//Java program to illustrate
//public modifier
package p1;
public class A
{
   public void display()
      {
          System.out.println("GeeksforGeeks");
      }
}
package p2;
import p1.*;
class B
{
    public static void main(String args[])
      {
          A obj = new A;
          obj.display();
      }
}

https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)
https://www.quora.com/In-Java-what-is-the-difference-between-public-class-and-class https://www.techopedia.com/definition/24018/public-java
https://www.geeksforgeeks.org/access-modifiers-java/


прежде всего, позвольте мне сказать, что в java нет такого термина, как "спецификатор доступа". Мы должны называть все "модификаторами". Как мы знаем, последний, статичный, синхронизированный, изменчивый.... называются модификаторами, даже Public, private, protected, default, abstract также должны называться модификаторами . Default - это такие модификаторы, где нет физического существования, но нет модификаторов, тогда его следует рассматривать как модификаторы по умолчанию.

чтобы оправдать это возьмем один пример:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

результат должен выглядеть так: Hello Java

теперь измените public на private и посмотрите, какую ошибку компилятора вы получите: Он говорит: "модификатор private здесь не разрешен" Какой вывод кто-то может быть неправильным или какой-то учебник может быть неправильным, но компилятор не может быть неправильным. Таким образом, мы можем сказать, что в java нет спецификатора доступа к терминам, все модификаторы.