Классы и абстракция, объекты

Типы данных, рассмотренные в предыдущей главе, — boolean, int, double и т. п. — называются примитивными. Переменная такого типа хранит одно число из определённого диапазона; название типа говорит только о техническом роде хранимой информации, но не даёт понимания о смысле значения — это может быть количество, координаты и т. п..

Одно значение примитивного типа напоминает атом — очень малую, условно неделимую часть чего-то целого. В жизни мы не рассматриваем окружающие предметы как горстки атомов, мы вводим уровень абстракции и видим, например, чашку кофе, телефон, гитару.

С помощью телефона можно набрать номер и позвонить: на советском стационарном телефоне придётся вращать диск, на Nokia 3310 нужно нажимать на кнопки, на Nexus 5 можно выбрать номер из телефонной книги. При этом клиенту телефона не обязательно знать его модель, страну производства и дату сборки. Достаточно знать абстракцию — это телефон, можно звонить.

public abstract class Phone {
    public abstract void dial(String number);
}

Именно так мы видим телефон: он может позвонить по номеру, заданному строкой. Это всё, что нужно для совершения звонка.

Но этого недостаточно для производства телефона.

// объявляем класс Nokia3310, 
// который является конкретным воплощением
// абстрактного понятия «телефон»
public class Nokia3310 extends Phone {
    public void dial(String number) {
        System.out.println("Передаём номер «" + number + 
                "» финскому GSM-модулю, сделанному в Венгрии.");
    }
}

class Nokia3310 extends Phone означает, что Nokia3310 перенимает характеристики класса Phone — в данном случае это наличие метода dial(String). Это называется наследованием.

Собираем себе новенькую Nokia 3310 и набираем номер:

public class PhoneTest {
    public static void main(String[] args) {
        Phone myNewPhone = new Nokia3310();
        myNewPhone.dial("+7 (900) 000-00-00");
    }
}

Выводится:

Передаём номер «+7 (900) 000-00-00» финскому GSM-модулю, сделанному в Венгрии.

В строке Phone myNewPhone = new Nokia3310(); создаётся новый объект класса Nokia3310 и записывается в локальную переменную myNewPhone типа Phone.

Так как класс Nokia3310 унаследован от Phone, любой экземпляр Nokia3310 является телефоном, поэтому его можно хранить в переменной типа Phone.

Задачи к уроку Комментарии к уроку

Nexus 5

Объявите класс Nexus5, который в методе dial(String number) выведет "Набираем номер " + number + " через сеть GSM 1900."

{{ message.data }}

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