Javanese Online

Поля. Модификаторы доступа public и private, сокрытие реализации

Поля

Объект может содержать в себе информацию. Информация хранится в т. н. полях — переменных, которые существуют для каждого экземпляра (объекта) определённого класса.

Для примера опишем подтип PhoneMobilePhone, экземпляры которого будут иметь уровень заряда.

public interface MobilePhone extends Phone {
    int getChargePercentage();
}

Перепишем класс Nokia3310 так, чтобы он был реализацией MobilePhone, а не Phone:

public final class Nokia3310 implements MobilePhone {

Теперь мы обязаны добавить реализацию метода getChargePercentage(). Чтобы иметь возможность определять уровень заряда аккумлятора, будем хранить напряжение в поле batteryVoltage:

public final class Nokia3310 implements MobilePhone {

    private double batteryVoltage = 3.8;

    public void dial(String number) {
        System.out.println("Передаём номер «" + number +
                "» финскому GSM-модулю, сделанному в Венгрии.");
    }

    public int getChargePercentage() {
        return (int) ((batteryVoltage - 3.5) / (4.2 - 3.5) * 100.0);
    }

}

Создадим новый телефон и проверим, заряжен ли он:

public static void main(String[] args) {
    MobilePhone myNewPhone = new Nokia3310();
    System.out.println("Аккумулятор заряжен на " +
            myNewPhone.getChargePercentage() + "%.");
}

Вывод:

Аккумулятор заряжен на 42%.

Модификаторы доступа public и private

Одной из задач ООП является сокрытие реализации: клиент класса не должен «видеть» «внутренности» класса и как-либо зависеть от них, он должен использовать только те методы, которые рассчитаны на внешнее взаимодействие. Такие методы называются публичными. Поле batteryVoltage приватное и не даёт возможности прочитать напряжение на аккумуляторе непосредственно.

Пусть у нашего телефона также будет IMEI, который будет выводиться при наборе *#06#.

public final class Nokia3310 implements MobilePhone {

    private double batteryVoltage = 3.8;
    private long imei = 100000000000000L + new Random().nextLong();

    public void dial(String number) {
        if (number.equals("*#06#")) {
            System.out.println("IMEI: " + imei);
        } else {
            System.out.println("Передаём номер «" + number +
                    "» финскому GSM-модулю, сделанному в Венгрии.");
        }
    }

    ...

}

В этом примере нельзя получить IMEI мобильного телефона извне, но можно вывести его на экран.

myNewPhone.dial("*#06#");
IMEI: 1946096103162947507
Комментарии к уроку

Сообщить об ошибке

Javanese.Online в GitHub

Чаты и каналы в Telegram

RSS-лента