Поля
Объект может содержать в себе информацию. Информация хранится в т. н. полях — переменных, которые существуют для каждого экземпляра (объекта) определённого класса.
Для примера опишем подтип Phone — MobilePhone, экземпляры которого будут иметь уровень заряда.
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