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

Разница между спецификатором доступа по умолчанию и спецификатором защищенного доступа в java

Я пытался изучить Java, и когда я прошел через спецификаторы доступа, у меня возникло сомнение, в чем разница между стандартным, если ни один не указан, и спецификатор защищенного доступа?

4b9b3361

Ответ 1

Спецификатор protected позволяет получить доступ ко всем подклассам рассматриваемого класса, независимо от того, в каком пакете они находятся, а также с другим кодом в том же пакете. Спецификатор по умолчанию позволяет получить доступ другим кодом в том же пакете, но не кодом, который находится в подклассах, находящихся в разных пакетах. См. Спецификация языка Java Раздел 6.6.

EDIT: по запросу Майкла Шмейсера (так что другим не нужно читать комментарии или следовать ссылке, чтобы найти это): все участники интерфейсов неявно публично. Фактически, ошибка времени компиляции задает любой спецификатор доступа для члена интерфейса, отличного от public (хотя спецификатор доступа по умолчанию не имеет общего доступа). Здесь полный набор правил из JLS для членов класса (см. Ссылку выше для правил для пакетов, классов и интерфейсов верхнего уровня и массивов):

Элемент (класс, интерфейс, поле или метод) ссылочного типа (класса, интерфейса или массива) или конструктор типа класса доступен только в том случае, если тип доступен, а член или конструктор объявлен разрешить доступ:

  • Если член или конструктор объявлен общедоступным, доступ разрешен.

  • Все члены интерфейсов неявно публично.

  • В противном случае, если член или конструктор объявлен защищенным, доступ разрешен только тогда, когда выполняется одно из следующих условий:

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

      
  • Доступ правильный, как описано в §6.6.2. (Этот раздел относится к правилам, позволяющим производным классам получать доступ к защищенным членам суперклассов; в §6.6.2 начинается: "Защищенный член или конструктор объекта может быть доступен извне пакета, в котором он объявляется только кодом, который является ответственный за реализацию этого объекта". Затем он уточняет это.)

      
  • В противном случае, если член или конструктор объявлен приватным, доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора.

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

Ответ 2

Эта Java tutorial может вам пригодиться.

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

Ответ 3

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

Защищенный: Защищенный модификатор доступа немного сложнее, и вы можете сказать, что это надмножество модификатора доступа по умолчанию. Защищенные члены такие же, как и члены по умолчанию, в отношении доступа в одном пакете. Разница в том, что защищенные члены также доступны для подклассов класса, в которых объявлен член, который находится вне пакета, в котором присутствует родительский класс. Но эти защищенные члены "доступны вне пакета только через наследование". т.е. вы можете получить доступ к защищенному элементу класса в своем подклассе, присутствующем в каком-либо другом пакете, как если бы этот член присутствовал в самом подклассе. Но этот защищенный член не будет доступен в подклассе вне пакета, используя ссылку на родительские классы. Смущенный языком? Возьмем пример. Скажем, в пакете A есть класс "Супер", содержащий защищенную целочисленную переменную "protected int x" и ее подкласс "Sub" в пакете B. Следующим будет юридический оператор в классе B:

System.out.println(x); // valid

В то время как следующее было бы незаконным утверждением:

System.out.println(new Super().x); // invalid,

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

Ответ 4

Спецификатор защищенного доступа - есть два способа доступа к защищенным данным

  • Защищенные члены данных, защищенные методы класса будут видны другим классам, если они находятся в одном пакете

  • Использование Наследование

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

Спецификатор доступа по умолчанию - только один способ доступа к данным по умолчанию

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

Пример

Чтобы проверить его по умолчанию, удалите защищенное ключевое слово для int x в ProvideProtected, будет создана ошибка времени компиляции.

        1. SuperClass

        package nee.superclass;

        public class ProvideProtected {
            protected int x=800;

        }

        2.Subclass


        package nee.subclass;

        import nee.superclass.*;

        public class AccessProtected extends ProvideProtected 

        {   
        public void accessProtected()
            {
                System.out.println(x);
            }

            public static void main(String[] args) {
                AccessProtected obj=new AccessProtected();
                obj.accessProtected();

            }

        }

Ответ 5

Защищенный модификатор доступа: - Все, что помечено как защищенное, отображается внутри одного и того же пакета, а также видимо в подклассе.

Доступ по умолчанию: - По умолчанию это не ключевое слово. Он применяется, если не указан модификатор доступа. Это в основном модификатор уровня пакета. Все, что имеет такой доступ, видимо в одном пакете.

Теперь разницу можно объяснить лучше с помощью примера

пакет p1

public class A
{

protected void fn()
{

}

} 

пакет p1

public class B
{

A a1 = new A();

a1.fn();// fn() is visible inside the same package

}

}

Теперь мы переходим к подклассу в другом пакете

пакет p2

public class D extends A

{

void test()

{

A a1 = new new A();

    //a1.fn() -->  would give compilation error
fn();

super.fn();

}

}

fn(), super.fn() не выдаст ошибку.

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

Обратите внимание, что super.fn() должен быть частью нестатического метода.