Модификаторы доступа в Java управляют видимостью классов и их членов. package-private — это доступ «по умолчанию» (если не писать модификатор): элемент доступен только внутри того же пакета. protected расширяет доступ: внутри пакета — как package-private, а также из классов-наследников в других пакетах. В этом практическом уроке/тренажере вы научитесь читать и исправлять модификаторы, понимать, что будет доступно при наследовании, и как это влияет на разработку. Пример: protected int id; в базовом классе.
- Без модификатора → package-private
protectedполезен для API базовых классов- Видимость определяется пакетом и наследованием
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модификаторы доступа (private, public).
- Геттеры и сеттеры (Getters/Setters).
- Пакетная видимость (package-private) и protected.
- Статические поля (static fields).
- Статические методы.
- Константы (static final).
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Сделайте член package-private
В Java для объявления члена класса с уровнем доступа package-private (по умолчанию) не нужно указывать модификатор — достаточно написать тип и имя. Такой член будет доступен только внутри того же пакета. В классе Storage часть полей и методов уже объявлена с явными модификаторами (private, protected). Дополните код, вписав объявления package-private членов без использования модификаторов доступа. Обратите внимание на комментарии, где указаны требуемые типы и имена.
package com.company.storage;
class Storage {
private String secretKey;
input1S; // package-private String name
protected int capacity;
input2S { // package-private void clear()
name = "";
capacity = 0;
}
input3S { // package-private String getName()
return name;
}
}2. Добавьте protected
В этом задании вам нужно правильно использовать модификатор доступа protected, чтобы обеспечить доступ к полю базового класса из класса-наследника, находящегося в другом пакете. Изучите код, в котором базовый класс Animal и класс-наследник Dog находятся в разных пакетах. Вам необходимо вставить ключевое слово protected в объявление поля базового класса, чтобы код компилировался и работал корректно. Обратите внимание на комментарии, которые указывают, где именно требуется внести изменения.
// Базовый класс в пакете animals
package animals;
public class Animal {
// Объявите поле name с модификатором, который разрешит доступ из наследника в другом пакете
input1S String name;
public Animal(String name) {
this.name = name;
}
}
// Класс-наследник в пакете pets (другой пакет)
package pets;
import animals.Animal;
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void printName() {
// Этот метод должен иметь доступ к полю name из базового класса
System.out.println("Dog's name: " + name);
}
}
// Класс Main для демонстрации
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.printName(); // Ожидаемый вывод: Dog's name: Buddy
}
}3. Исправьте неверный модификатор
В данном фрагменте кода на Java демонстрируется наследование между классами из разных пакетов. Один из модификаторов доступа выбран некорректно, что приводит к ошибке компиляции при попытке обращения к методу. Найдите и исправьте этот модификатор, чтобы обеспечить доступность метода в подклассе, находящемся в другом пакете. Обратите внимание, что исправлять нужно ровно одну строку.
// package a;public class Parent { void display() { System.out.println("Parent display"); }} // package b;public class Child extends Parent { public void show() { display(); }}4. Сопоставьте модификатор и область видимости
Сопоставьте каждый модификатор доступа или особый случай из левой колонки с кратким описанием его области видимости из правой колонки. Обратите внимание на ключевые различия между package-private (модификатор по умолчанию), protected и частным случаем protected вне пакета.
5. Скомпилируется ли обращение?
Проанализируйте приведённый код на Java, который демонстрирует попытку доступа к protected полю из класса, находящегося в другом пакете. Обращение происходит через ссылку на объект родительского класса. Определите, будет ли такой код скомпилирован, и выберите соответствующий вариант ответа, объясняющий причину ошибки или её отсутствие.
// Файл A.java в пакете p1
package p1;
public class A {
protected int value;
}
// Файл C.java в пакете p2
package p2;
import p1.A;
public class C extends A {
public void test() {
A obj = new A();
int x = obj.value; // Будет ли это компилироваться?
}
}6. Соберите пример с protected и пакетом
Из предложенных строк соберите корректную java-программу, которая демонстрирует доступ к членам класса с модификаторами package-private и protected из подкласса в том же пакете. Программа должна включать объявление пакета, базовый класс с package-private и protected членами, подкласс, который обращается к этим членам. Лишняя строка с объявлением private члена не должна входить в решение.
package com.example;class BaseClass { int packagePrivateVar; protected int protectedVar; private int privateVar;}class SubClass extends BaseClass { void access() { protectedVar = 10; packagePrivateVar = 20; }}7. Разложите утверждения по категориям
Перед вами список утверждений, описывающих область видимости членов класса в Java. Распределите каждое утверждение по одной из трёх категорий: 'Только внутри класса', 'Внутри пакета' или 'Вне пакета (через наследование)'. Учтите, что в Java модификаторы доступа (private, package-private, protected) определяют, где можно использовать поле, метод или конструктор. Каждое утверждение однозначно соответствует одному из этих модификаторов.