Разница между спецификатором доступа по умолчанию и спецификатором защищенного доступа в Java - PullRequest
20 голосов
/ 26 марта 2012

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

Ответы [ 4 ]

33 голосов
/ 02 мая 2012

Этот учебник по Java может быть вам полезен.

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
33 голосов
/ 26 марта 2012

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

РЕДАКТИРОВАТЬ: По запросу Михаэля Шмайсера (чтобы другим не приходилось читать комментарии или переходить по ссылке, чтобы найти это): все члены интерфейсов неявно общедоступны. Фактически, это ошибка времени компиляции, указывающая любой спецификатор доступа для члена интерфейса, кроме public (хотя вообще нет спецификатора доступа по умолчанию для общего доступа). Вот полный набор правил из JLS для членов класса (см. Ссылку выше для правил для пакетов, классов и интерфейсов верхнего уровня и массивов):

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

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

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

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

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

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

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

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

3 голосов
/ 24 апреля 2015

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

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

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

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

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

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

Пример

Чтобы проверить его по умолчанию удалить защищенное ключевое слово для 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();

            }

        }
2 голосов
/ 06 апреля 2017

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

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

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

package 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() должен быть частью нестатического метода.

...