В чем разница между общедоступным, защищенным, частным и частным в Java? - PullRequest
2846 голосов
/ 18 октября 2008

В Java существуют четкие правила относительно того, когда использовать каждый из модификаторов доступа, а именно: значения по умолчанию (закрытый пакет), public, protected и private при создании class и interface и работе с ними. с наследством?

Ответы [ 24 ]

17 голосов
/ 18 июня 2014

Частный : ограниченный доступ только к классу

По умолчанию (без модификатора) : ограниченный доступ к классу и пакету

Защищено : ограниченный доступ к классу, пакету и подклассам (как внутри, так и снаружи пакета)

Public : Доступно для класса, пакета (всех) и подклассов ... Короче говоря, везде.

16 голосов
/ 19 октября 2008

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

14 голосов
/ 07 августа 2016

Модификаторы доступа в Java.

Модификаторы доступа Java используются для обеспечения контроля доступа в Java.

1. По умолчанию:

Доступно только для классов в одном пакете.

Например,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

Этот доступ более ограничен, чем общедоступный и защищенный, но менее ограничен, чем частный.

2. Открытый

Доступен из любого места. (Глобальный доступ)

Например,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Выход: Привет

3. Mail

Доступно только внутри одного класса.

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

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Защищенный

Доступно только для классов в одном пакете и для подклассов

Например,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

Вывод: Hello

Enter image description here

14 голосов
/ 17 декабря 2014

Модификаторы доступа предназначены для ограничения доступа на нескольких уровнях.

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

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

По умолчанию: Он доступен в одном пакете из любого класса пакета.

Для доступа вы можете создать объект класса. Но вы не можете получить доступ к этой переменной за пределами пакета.

Защищено: вы можете обращаться к переменным в том же пакете, а также к подклассу в любом другом пакете. так что в основном это default + Inherited поведение.

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

Личное: это может быть доступ в том же классе.

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

12 голосов
/ 21 октября 2015

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

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

  • Члены и конструкторы класса по умолчанию закрыты для пакета. ( JLS §6.6.1 )

  • Конструкторы Enum приватны по умолчанию . (Действительно, перечислители должны быть частными, и попытка сделать их общедоступными или защищенными является ошибкой). Константы перечисления являются общедоступными и не допускают какого-либо спецификатора доступа. Другие члены перечислений по умолчанию закрыты для пакета. ( JLS §8,9 )

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

12 голосов
/ 29 августа 2015
  • public - доступно из любой точки приложения.

  • по умолчанию - доступно из пакета.

  • защищен - доступен из пакета и подклассов в другом пакете. а также

  • личное - доступно только для своего класса.

12 голосов
/ 26 мая 2015

Видимо для пакета. По умолчанию. Модификаторы не нужны.

Доступно только для класса ( личное ).

Видимый миру ( публичный ).

Доступно для пакета и всех подклассов ( protected ).

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

String name = "john";

public int age(){
    return age;
}

Модификатор личного доступа - частный:

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

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

Использование модификатора private - это основной способ, которым объект инкапсулирует себя и скрывает данные от внешнего мира.

Примеры:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Модификатор публичного доступа - общедоступный:

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

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

Из-за наследования классов все открытые методы и переменные класса наследуются его подклассами.

Пример:

public void cal(){

}

Модификатор защищенного доступа - защищено:

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

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

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

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
10 голосов
/ 15 марта 2012

Эта страница хорошо описывает модификатор защищенного доступа и доступа по умолчанию

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

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

8 голосов
/ 19 октября 2008

Ответ Дэвида дает значение каждого модификатора доступа. Что касается того, когда использовать каждый из них, я бы предложил обнародовать все классы и методы каждого класса, предназначенные для внешнего использования (его API), а все остальное - личное.

Со временем вы поймете, когда делать некоторые классы закрытыми для пакетов, а когда объявлять определенные методы защищенными для использования в подклассах.

6 голосов
/ 17 ноября 2016

Примечание: Это просто дополнение для принятого ответа.

Это относится к Java Модификаторы доступа .

Из Модификаторы доступа к Java :

Модификатор доступа Java указывает, какие классы могут получить доступ к данному класс и его поля, конструкторы и методы. Модификаторы доступа могут указывается отдельно для класса, его конструкторов, полей и методы. Модификаторы доступа к Java также иногда упоминаются в ежедневных речь как спецификатор доступа к Java, но правильное имя - доступ к Java модификаторы. Классы, поля, конструкторы и методы могут иметь один из четыре различных модификатора доступа Java:

  • Элемент списка
  • частный
  • по умолчанию (пакет)
  • 1025 * защищен *
  • 1027 * общественное *

С Управление доступом к членам класса учебные пособия:

Модификаторы уровня доступа определяют, могут ли другие классы использовать конкретное поле или вызвать конкретный метод. Есть два уровня контроля доступа:

  • На верхнем уровне - public или package-private (без явного модификатора).
  • На уровне участника - открытый, закрытый, защищенный или закрытый для пакета (без явного модификатора).

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

В следующей таблице показан доступ к членам, разрешенный каждым Модификатор.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

Первый столбец данных указывает, имеет ли сам класс доступ к член, определенный уровнем доступа. Как видите, класс всегда имеет доступ к своим членам. Во втором столбце указано, классы в том же пакете, что и класс (независимо от их Родители) имеют доступ к участнику. Третий столбец указывает имеют ли подклассы класса, объявленного вне этого пакета доступ к члену. Четвертый столбец указывает, все ли классы иметь доступ к участнику.

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

...