Защищенный Java: основные принципы безопасности программирования
Защищенный (protected) модификатор доступа в языке программирования Java предоставляет доступ к переменным и методам из других классов в том же пакете или из подклассов. Ключевое слово protected обеспечивает средний уровень доступа, сильнее, чем default, но более ограниченный, чем public.
Применение protected модификатора в Java позволяет использовать наследование и полиморфизм в объектно-ориентированной парадигме программирования. Рассмотрим примеры кода, иллюстрирующие это применение:
Пример 1: Защищенный доступ к переменным
package myPackage;
public class ParentClass {
protected int protectedVariable = 10;
private int privateVariable = 20;
protected void protectedMethod() {
System.out.println("Метод с защищенным доступом");
}
private void privateMethod() {
System.out.println("Метод с закрытым доступом");
}
}
package myPackage;
public class ChildClass extends ParentClass {
public void accessProtected() {
System.out.println("Защищенная переменная из родительского класса: " + protectedVariable);
protectedMethod();
// Не доступна из дочернего класса:
// System.out.println("Приватная переменная из родительского класса: " + privateVariable);
// privateMethod();
}
}
package myPackage;
public class Main {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.accessProtected();
}
}
В данном примере, переменная protectedVariable и метод protectedMethod() объявлены с защищенным доступом в классе ParentClass. Дочерний класс ChildClass может получить доступ к этим элементам без каких-либо проблем. Однако, переменная privateVariable и метод privateMethod(), объявленные с закрытым доступом, недоступны для дочернего класса.
Пример 2: Применение protected в наследовании абстрактных классов
package myPackage;
public abstract class Shape {
protected int x;
protected int y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
protected abstract double getArea();
}
package myPackage;
public class Rectangle extends Shape {
protected int width;
protected int height;
public Rectangle(int x, int y, int width, int height) {
super(x, y);
this.width = width;
this.height = height;
}
protected double getArea() {
return width * height;
}
}
package myPackage;
public class Main {
public static void main(String[] args) {
Shape rectangle = new Rectangle(0, 0, 5, 7);
double area = rectangle.getArea();
System.out.println("Площадь прямоугольника: " + area);
}
}
В этом примере класс Shape является абстрактным и имеет защищенные переменные x и y. Класс Rectangle наследует класс Shape и имеет свои собственные защищенные переменные width и height. Класс Rectangle переопределяет абстрактный метод getArea(). В главной функции создается объект типа Rectangle и вызывается метод getArea() для вычисления площади прямоугольника.
Примеры, приведенные выше, демонстрируют применение защищенного модификатора доступа в Java. Он позволяет наследникам классов иметь доступ к защищенным элементам, что упрощает взаимодействие между классами, способствует переиспользованию кода и обеспечивает более гибкую иерархию классов.