12 ответов:
видимость по умолчанию известна как" частный пакет " (хотя вы не можете использовать это явно), что означает, что поле будет доступно изнутри того же пакета, к которому принадлежит класс.
Как указал mdma, это не верно для членов интерфейса, для которых по умолчанию используется "public".
посмотреть спецификаторы доступа Java
спецификатор по умолчанию зависит от контекста.
для классов и объявлений интерфейса значение по умолчанию-package private. Это относится к защищенным и закрытым, позволяя доступ только к классам в одном пакете. (protected-это так, но также позволяет получить доступ к подклассам вне пакета.)
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) конструктор по умолчанию обычно искажается как всегда является общедоступным, но в редких случаях это не эквивалент.
в перечислениях конструкторычастная по умолчанию. Действительно, перечислители должны быть частными, и это-ошибка, чтобы указать их как public или protected. Константы перечисления всегда общественные, и не разрешать какой-либо спецификатор доступа. Другие члены перечислений являются пакета-частная по умолчанию. (JLS §8.9)
в интерфейсах и типах аннотаций все члены (опять же, это означает, что поля, методы и объявления вложенных типов) являются общественные by по умолчанию. Действительно, члены интерфейсов и типы аннотаций должны быть открытым, и это-ошибка, чтобы указать их как private или protected. (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
вот цитата о видимости уровня пакета из интервью с Джеймсом Гослингом, создателем Java:
Билл Веннерс: Java имеет четыре уровня доступа. По умолчанию используется пакет. Я всегда задавались вопросом, было ли удобно сделать доступ к пакету по умолчанию потому что три ключевых слова, о которых люди из C++ уже знали были частными, защищенными и публичными. Или если бы у вас было что-то особенное причина, по которой вы чувствовали, что доступ к пакету должен быть по умолчанию.
Джеймс Гослинг: пакет, как правило, набор вещей, которые являются своего рода пишется вместе. В общем, я мог бы сделать одну из двух вещей. Одним из них было заставить вас всегда вставлять ключевое слово, которое дает вам домен. Или у меня могло быть значение по умолчанию. И тогда возникает вопрос, что делает разумным дефолт? И я, как правило, иду на то, что меньше всего опасный предмет.
Так что общественности было бы очень плохо, чтобы сделать по умолчанию. Частный, вероятно, было бы плохо сделать дефолт, если только потому, что люди на самом деле не пишут частные методы так часто. И то же самое с защищенными. И глядя на кучу кода, что Я решил, что самая обычная вещь, которая была достаточно безопасна был в пакете. И у C++ не было ключевого слова для этого, потому что у них не было понятия о пакетах.
но мне понравилось это, а не понятие друзей, потому что с друзьями вы вроде как надо перечислить, кто все твои друзья, и так если вы добавляете новый класс в пакет, а затем вам обычно приходится перейти ко всем классам в этом пакете и обновить своих друзей, что я всегда считал полной занозой в заднице.
но сам список друзей вызывает своего рода проблему с версиями. И так появилось это понятие дружественного класса. И самое приятное, что Я сделал это по умолчанию -- я решу проблему так что должен ключевое слово быть?
какое-то время там действительно было дружественное ключевое слово. А потому что все другие начинают с "P", это было" phriendly "с " PH". но это было только там, может быть, на день.
обновление Java 8 использование
defaultключевое слово: Как и многие другие отметили видимость по умолчанию (без ключевого слова)поле будет доступно изнутри того же пакета, к которому класс принадлежит.
Не путать с новым Java 8 функция (Методы По Умолчанию), что позволяет интерфейсу обеспечить реализацию, когда его помечены с
defaultключевое слово.посмотреть: модификаторы доступа
в JAVA есть модификатор доступа, называемый "default", который позволяет напрямую создавать экземпляр этой сущности только в этом пакете.
вот полезная ссылка:
общественные - это ключевое слово, которое используется как модификатор доступа для методов и переменных. Переменная (поле) или метод объявлены как public виден и доступен для всех классов, определенных в разных пакетах.
The общественные ключевое слово используется во многих объектно-ориентированных языках программирования (OOPL), включая C++, Java, C# и Visual Basic.NET (VB.NET публичный член слабо связан с классом и менее ограничен, чем частный член. Переменные или поля, объявленные общедоступными, не имеют ограничений доступа. Частный член, однако, виден только в своем классе.
модификатором доступа public Поля, методы и конструкторы, объявленные общедоступными (наименее ограничительными) в общедоступном классе, видны любому классу В программе Java, независимо от того, находятся ли эти классы в одном пакете или в другом пакете.
другие модификаторы доступа
- частная
- защищенный
- по умолчанию
частный (наиболее ограничительные) поля или методы не могут использоваться для классов и интерфейсов. Он также не может быть использован для полей и методов в интерфейсе. Поля, методы или конструкторы, объявленные частными, строго контролируются, что означает, что они не могут быть доступны нигде за пределами заключающего класса. Стандартная стратегия проектирования состоит в том, чтобы сделать все поля частные и предоставляют публичные методы получения для них.
защищенные поля или методы не могут быть использованы для классов и интерфейсов. Он также не может быть использован для полей и методов в интерфейсе. Поля, методы и конструкторы, объявленные защищенными в суперклассе, могут быть доступны только подклассам в других пакетах. Классы в одном пакете также могут обращаться к защищенным полям, методам и конструкторам, даже если они не являются подклассом защищенного пакета класс участника.
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 нет такого термина, как "спецификатор доступа". Мы должны называть все как "модификаторы". Как мы знаем, что окончательное, статическое, синхронизированное, изменчивое.... называются модификаторы, даже государственные, частные, защищенные, по умолчанию, резюме должно быть названы в качестве модификаторов . Default - это такие модификаторы, где физического существования нет, но нет модификаторов, тогда его следует рассматривать как модификаторы по умолчанию.
чтобы оправдать это возьмем один пример:
public class Simple{ public static void main(String args[]){ System.out.println("Hello Java"); } }результат должен выглядеть так:
Hello Javaтеперь измените public на private и посмотрите, какую ошибку компилятора вы получаете: Он говорит: "модификатор private здесь не допускается" Какой вывод кто-то может ошибаться или какой-то учебник может быть неправильным, но компилятор не может ошибаться. Таким образом, мы можем сказать, что в java нет спецификатора доступа к терминам, все это модификаторы.
Comments