Java.SCJP-310-065. Объектное ориентирование

Инкапсуляция (Encapsulation, IS-A, HAS-A)
- Инкапсуляция помогает спрятать реализацию за интерфейсом или API.
- Инкапсулированный код имеет две особенности:
Объектные переменные остаются защищенными (protected)
Геттеры и сеттеры ( getters and setters ) предоставляют доступ к объектным переменным.
- IS-A ссылается на наследование или реализацию
- IS-A выражается через ключевое слово extends.
- IS-A, "наследуется от ", и "..есть подтипом " являются эквивалентными выражениями.
- HAS-A значит, что объект одного класса "has a" (содержит) ссылку на экземпляр другого класса или другой экземпляр этого же класса.
Наследование (Inheritance)
- Наследование разрешает классу быть подклассом суперкласса и, в то же время, наследовать public и protected переменные и методы суперкласса.
- Наследование - ключевая концепция, которая лежит в основе отношения IS-A, полиморфизма, переопределения, перегрузки и кастинга.
- Все классы ( кроме класса Object ), являются подклассами типа Object, и наследуют методы этого класса.
Полиморфизм ( Polymorphism)
- Полиморфизм означает "много форм".
- Ссылочная переменная всегда является одного, неизменяемого типа, но она может ссылаться на объекты подтипов.
- На объект могут ссылаться переменные многих различных типов - если они одного и того же типа или подтипа.
- Тип ссылочной переменной ( не тип объекта ) определяет, какой метод может быть вызван.
- Полиморфические вызовы методов применимы только к переопределенным объектным методам.
Переопределение и перегрузка ( overriding and overloading )
- Методы могут быть переопределены или перегружены; конструкторы могут быть перегружены, но не переопределены.
- Абстрактные методы могут быть переопределены в первом не абстрактном подклассе.
- Метод считается подходящим для переопределения, если он:
Имеет такой же список аргументов.
Имеет такой же возвращаемый тип, кроме случая с Java 5, когда возвращаемый тип может быть подклассом.
Не имеет более жесткого модификатора доступа.
Может иметь менее жесткий модификатор доступа.
Не должен порождать новые или более широкие исключения.
Может порождать более узкие исключения.
- final методы не могут быть переопределены.
- Только унаследованные методы могут быть переопределены, и помните, что private методы НЕ НАСЛЕДУЮТСЯ!
- Подкласс использует super.overridenMethodName() для вызова метода версии суперкласса.
- Перегрузка означает повторное использование имени метода, но с другими аргументами.
- Перегруженные методы:
Должны иметь различный список аргументов
Должны иметь разные возвращаемые типы, если список аргументов также отличается
Должны иметь различные модификаторы доступа
Могут порождать различные исключения.
- Методы суперкласса могут быть перегруженны в подклассе.
- Полиморфизм применим для переопределения, а не для перегрузки.
- Объектный тип ( не тип ссылочной переменной), определяет какой из переопределенного метода должен быть вызван в runtime.
- Ссылочный тип определяет какой перегруженный метод будет использован при компиляции.
Кастинг ссылочных переменных ( reference variable casting):
- Есть два типа ссылочного приведения типов: нисходящее и восходящее. ( downcasting , upcasting)
- Нисходящее приведение типов: Если у Вас есть ссылочная переменная, которая ссылается на объект подкласса, вы можете присвоить ее к ссылочной переменной подтипа. Вы должны сделать явное приведение типов и, как результат, вы сможете доступаться к членам подкласса через новую ссылочную переменную.
- Восходящее приведение типов: Вы можете присвоить ссылочную переменную к переменной типа суперкласса явно или неявно. Это - безопасная операция с точки зрения наследования, потому что это присваивание обделяет доступ к новой переменной.
Реализация интерфейса (Interface implementation):
- Когда Вы реализовываете интерфейс, вы полностью подписываетесь под его манифестом.
- Вы реализовываете интерфейс через тщательное переопределение всех методов, определенных в интерфейсе.
- Один класс может реализовывать множество интерфейсов.
Возвращаемые типы (Return types):
- Перегруженные методы могут изменять возвращаемые типы; переопределенные методы не могут, за исключением ковариантных случаев- возвращаемый тип = подкласс.
- Объектная ссылка может принимать null в качестве возвращаемого типа.
- Массив - валидный возвращаемый тип - и в сигнатуре и как возвращаемое значение.
- Для методов с примитивами в роли возвращаемых типов, любое значение, которое может быть неявно конвертировано в возвращаемый тип, могут быть возвращены.
- Ничего нельзя возвращать в случае с void, и вы можете вернуть ничего. Вам разрешено просто сказать return; в любом методе с void в роли возвращаемого типа. Но Вы не можете ничего не возвращать в случае с не void типами.
- Методы с возращаемым типом в роли объектной ссылки, могут возвращать подтип.
- Методы с интерфейсом в роли возвращаемого типа, могут возвращать любой класс, который его реализовывает.
Конструкторы и создание объектов ( Constructors and instantiation):
- Конструктор всегда вызывается, когда новый объект создается.
- Любой суперкласс в дереве наследования любого объекта вызовет конструктор.
- Любой класс, даже абстрактный, имеет по крайней мере один конструктор.
- Конструкторы должны иметь идентичное имя с классом.
- Конструкторы не имеют возвращаемого типа. Если Вы посмотрите на код метода с возвращаемым типом, то поймете, что это не конструктор, а просто метод с таким же названием.
- Типичное выполнение конструктора выглядит следующим образом:
Конструктор вызывает конструктор суперкласса, который зовет, в свою очередь, конструктор своего суперкласса. Так продолжается до тех пор, пока не будет вызван конструктор Object.
Конструктор класса Object выполняется и возвращается к вызывающему конструктору и так вниз по стеку до первого вызвавшего.
- Конструкторы могут использовать любой модификатор доступа, даже private.
- Компилятор создаст конструктор по умолчанию, если вы не создадите ни одного конструктора в вашем классе.
- Конструктор по умолчанию - конструктор без аргументов и с вызовом конструктора суперкласса без параметров.
- Первым выражением конструктора должен быть вызов либо this() = конструктора по умолчанию данного класса, либо super().
- Объектные члены доступны только после запуска конструктора суперкласса.
- Абстрактные классы имеют конструкторы, которые зовутся только после создания объекта подкласса.
- Интерфейсы не имеют конструкторов.
- Если Ваш суперкласс не имеет конструктора по умолчанию, вы должны создать конструктор и вставить вызов super() с аргументами, которые совпадают с аргументами суперкласса.
- Конструкторы никогда не наследуются, поэтому не могут быть переопределены.
- Конструктор может быть явно вызван только из другого конструктора ( используя вызов super() или this().
- Нюансы с вызовом this():
Вызов должен быть первой строкой конструктора
Список аргументов определяет, какой из перегруженных конструкторов вызывается.
Конструкторы могут вызывать конструкторы и тд. но рано или поздно одному из них лучше вызвать super(), иначе стек взорвется к ебеням.
Вызовы this() и super() не могут быть в одном конструкторе. Вы можете иметь один из них, но никогда оба.
Статические данные (Statics)
- Используйте static методы для реализации поведения, которое не влияет на состояние ни одного из объектов этого класса.
- Используйте статические переменные для содержания данных, специфических для этого класса.
- Все статические члены принадлежат классу, но ни одному из объектов класса.
- Статический метод не может доступаться к объектным переменным напрямую.
- Используйте оператор "точка" для доступа к статическим данным, но помните, что использование ссылочных переменных с оператором точка есть ни что иное, как синтаксический трюк, и компилятор будет подставлять имя класса для ссылочной переменной.
- Статические методы не могут быть переопределены, но они могут быть определены заново.
Конец







Отправить комментарий