В Java реализованы все четыре ключевых принципа объектно-ориентированного программирования (ООП): инкапсуляция, наследование, полиморфизм и абстракция.
private, protected, public) и геттеры/сеттеры для достижения инкапсуляции.public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
extends. Это способствует повторному использованию кода.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // вызовет реализацию в Dog
public interface Drawable { void draw(); }
Что происходит, если в Java класс наследует интерфейс и абстрактный класс, у которых есть методы с одинаковой сигнатурой? Какое поведение продемонстрирует наследуемый класс?
Ответ: Если и абстрактный класс, и интерфейс определяют одинаковую сигнатуру метода, то достаточно реализовать этот метод один раз в производном классе. Однако если абстрактный класс реализовал этот метод, то Java использует его реализацию. Интерфейсные дефолтные методы переопределяются только при необходимости.
interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() выведет "B"
История
В проекте для банка разработчик делал все поля
publicи обращался к ним напрямую. Это привело к неконтролируемому изменению состояния объектов и сложному поиску ошибок. Впоследствии весь код пришлось переписывать на использование private-полей и методов доступа.
История
Один из новых сотрудников пытался переопределить private-метод базового класса, считая, что это поддерживает полиморфизм. Но фактически создавался новый метод в дочернем классе, а вызовы из базового вызывали оригинальную версию, что приводило к неожиданному поведению.
История
Использование интерфейсов с дефолтными методами из нескольких источников привело к ошибке "class X inherits unrelated defaults for Y() from types A and B" — сотрудник не знал, что такие конфликты должны вручную разрешаться в дочернем классе.