109.29K
Категория: ПрограммированиеПрограммирование

Введение в ООП. Классы и объекты

1.

Введение в ООП.
Классы и объекты

2.

Переменные в классах
Так что же является содержимым класса? Это в основном переменные
и функции. Переменные предназначены, для того чтобы хранить
данные описываемого классом объекта. Так, если вам необходимо
описать геометрическую точку у вас должны быть переменные,
описывающие ее координаты. В классе это будет выглядеть следующим
образом:
public class Point {
int x;
int y;
}
Таким образом, мы говорим, что в объектах нашего класса точка будет
описываться двумя значениями: x и y. Переменные созданные в самом
классе называются свойствами класса.

3.

Методы в классах
public class Point {
private int x;
public void setX(int x1) {
x = x1;
}
public int getX() {
return x;
}
}
Функция setX получает извне новое значение для x и заносит его в свойство класса. Функция
getX возвращает значение x. Для возвращения значения используется оператор return. После
него ставится возвращаемое значение и точка с запятой. Оператор return всегда прекращает
работу функции. Если функция имеет тип результата void, после return не должно стоять
возвращаемого значения, а сразу должна идти точка с запятой. Также если и результат void
оператор return вообще может отсутствовать. В этом случае функция завершается, когда
выполнились все операции, которые находятся в ее теле.
Имена методов которые возвращают Boolean будут содержать в названии (is)

4.

Создание классов и объектов
public class Lamp {
private boolean isOn;
public void on() {
isOn = true;
}
public void off() {
isOn = false;
}
public boolean getState() {
return isOn;
}
}

5.

Для того, чтобы начать использование этого класса, необходимо создать его объект.
Например, это можно сделать внутри функции main. Сначала следует создать переменную
объекта:
Lamp first;
Созданная переменная пока не содержит объекта. Переменные классов не содержат самих
объектов, они служат для хранения адресов объектов в памяти. Изначально в переменной
будет пустое значение, т.е. null. И если вы попытаетесь у этой переменной вызвать методы
класса, вы получите ошибку. Чтобы создать сам объект, следует воспользоваться оператором
new в таком виде:
first = new Lamp();
После этого объект будет создан, и лампочку можно включить, например:
first.on();
Можно совместить объявление переменной и создание объекта:
Lamp first = new Lamp();
На один и тот же объект может ссылаться несколько переменных. Так вы можете записать:
Lamp first2 = first;
В результате у нас будет две переменных: first и first2, но они будут ссылаться на один и тот
же объект. Созданная нами лампочка будет существовать, пока есть хоть одна переменная, в
которой храниться адрес этого объекта. После того, как все ссылки на объект исчезли, он
будет уничтожен специальной службой, которая называется сборщиком мусора.(garbage
collector)

6.

Конструкторы. Ссылка this.
Для выполнения операций, необходимых для создания класса, в Java
используются конструкторы. Конструктор — метод класса, вызываемый
при создании объекта. Главные особенности объявления конструктора:
он должен иметь имя, совпадающее с именем класса, и не должен
иметь возвращаемого значения (даже void).
ТипДоступа ИмяКласса(){ ... }
Например, мы хотим, чтобы каждая лампочка из предыдущего примера
при создании была включена. Для этого в класс необходимо добавить
метод вида:
public Lamp() { isOn = true; }
В результате, когда мы будем использовать оператор new для создания
нового объекта, будет вызываться данный метод, и включать лампочку.

7.

Конструкторы могут иметь входные параметры. В этом случае при создании объекта можно
указать в скобках значения для этих параметров. Конструкторы также могут быть
перегружены, т.е. может быть несколько конструкторов с разными наборами параметров. Это
же относится и к другим методам. Можно создать
несколько вариантов функции с одинаковыми именами и разными исходными параметрами.
Данный механизм называется перегрузкой функций (overloading). Например, нам
необходимо создать класс описывающий геометрическую точку с двумя координатами:
public class Point {
private int x;
private int y;
public Point(){
x = 1;
y = 1;
}
public Point(int x1,int x2){
x = x1;
y = x2;
}
}
Такую точку можно создать двумя способами:
Point p1 = new Point();
Point p2 = new Point(15,6);

8.

Если в конструкторе или другом методе возникает конфликт имен, может
использоваться ссылка this. Она представляет ссылку на объект, вызвавший данный
метод. Например, второй конструктор класса Point может быть переписан в виде:
Point(int x,int y) {
this.x = x;
this.y = y;
}
Также this может использоваться для вызова из конструктора других конструкторов.
Например, можно создать еще один конструктор:
Point(int x) {
this(x,x);
}
Т.к. в языке Java присвоение начальных значений переменным может быть
выполнено несколькими способами, следует учитывать порядок назначения
начальных значений. Первыми выполняются назначения начальных значений при
создании свойств, а последним выполняется конструктор и заданные в нем действия.
Т.е. в классе Point сначала свойства x и y получают нулевые значения, и только затем
в конструкторе, их значения меняются. Так

9.

Статические и константные члены класса.
Для объявления статических переменных, констант, методов и
инициализаторов перед их объявлением указывается ключевое
слово static.

10.

Статические поля
При создании объектов класса для каждого объекта создается своя копия нестатических обычных полей.
А статические поля являются общими для всего класса. Поэтому они могут использоваться без создания
объектов класса.
class Person{
private int id;
static int counter=1;
Person(){
id = counter++;
}
public void displayId(){
System.out.printf("Id: %d \n", id);
}
}

11.

Статические константы и инициализаторы
public static final double PI = 3.14;
Инициализаторы бывают как статическими так и не статическими.
class Person {
private int id;
static int counter;
static {
counter = 105;
System.out.println("Static initializer");
}
Person() {
id=counter++;
}
public void displayId() {
System.out.printf("Id: %d \n", id);
}
}

12.

Статические методы
• Статические методы также относятся ко всему классу в целом.
При использовании статических методов надо учитывать
ограничения: в статических методах мы можем вызывать только
другие статические методы и использовать только статические
переменные.
• Вообще методы определяются как статические, когда методы не
затрагиют состояние объекта, то есть его нестатические поля и
константы, и для вызова метода нет смысла создавать экземпляр
класса.

13.

public class Program{
public static void main(String[] args) {
System.out.println(Operation.sum(45, 23));
// 68
System.out.println(Operation.subtract(45, 23)); // 22
System.out.println(Operation.multiply(4, 23)); // 92
}
}
class Operation {
static int sum(int x, int y){
return x + y;
}
static int subtract(int x, int y){
return x - y;
}
static int multiply(int x, int y){
return x * y;
}
}
В данном случае для методов sum, subtract, multiply не имеет значения, какой именно экземпляр класса
Operation используется. Эти методы работают только с параметрами, не затрагивая состояние класса. Поэтому
их можно определить как статические.

14.

Класс
Шаблоном или описанием объекта является класс, а объект
представляет экземпляр этого класса. Можно еще провести
следующую аналогию. У нас у всех есть некоторое представление о
человеке - наличие двух рук, двух ног, головы, туловища и т.д. Есть
некоторый шаблон - этот шаблон можно назвать классом. Реально
же существующий человек (фактически экземпляр данного класса)
является объектом этого класса.

15.

Абстрактный класс
Java позволяет создавать классы, предназначенные только для
наследования. Т.е. классы, которые не позволяют создавать
объекты, а только дочерние классы. Абстрактный класс может
иметь и полностью описанные методы, и абстрактные методы, у
которых отсутствует тело, и которые должны быть реализованы в
дочерних классах. Такие методы должны быть описаны с
ключевым словом abstract, а вместо тела метода ставится знак
точки с запятой.

16.

abstract class Fig {
private float x;
private float y;
float getX(){
return x;
}
float getY(){
return y;
}
void move(float dx, float dy){
x += dx;
y += dy;
}
abstract float calcArea();
abstract void printType();
}

17.

Интерфейсы
Существует еще один особый тип, который является еще более
абстрактным, чем абстрактные классы. Это интерфейсы. Если
абстрактный класс может хотя бы частично содержать реализацию
класса (в нем могут присутствовать обычные свойства и методы),
то интерфейс описывает только, как класс будет
взаимодействовать с другими классами. Поэтому в нем могут
содержаться только абстрактные методы. Но начиная с java 8,
интерфейс может содержать методы с реализацией (
обозначаются модификатором default)

18.

interface Lamp {
void on();
void off();
default void printState(String state){
System.out.println(state);
}
}

19.

Отличие интерфейса и абстрактного
класса
1. Ключевое слово abstract используется для того, чтобы создать
абстрактный класс с методами, а ключевое слово interface
используется для создания интерфейса и не может быть
использовано с методами.
Подклассы используют ключевое слово extends чтобы наследовать
абстрактный класс. При этом они не должны обеспечить
реализацию всех заявленных методов в абстрактном
классе.(обеспечивает реализацию только абстрактных методов)
Если же подкласс не является абстрактным классом и использует
ключевое слово implements для реализации интерфейсов, то он
должен обеспечить реализацию для всех методов, объявленных в
интерфейсе.

20.

2. Абстрактные классы могут иметь конструкторы; интерфейсы не
могут иметь конструкторов.
3. У абстрактного класса есть все черты обычного Java-класса, за
исключением того, что мы не можем создать его экземпляр.
Интерфейс может иметь только статические public static
final константы и объявления методов без тела и default методы.
4. Абстрактные методы классов могут иметь public, private,
protected и static модификаторы доступа, а методы интерфейса
неявно public и abstract, поэтому мы не можем использовать
другие модификаторы доступа с методами интерфейса.
5. Подкласс может наследовать только один абстрактный класс,
и реализовать несколько интерфейсов.
6. Абстрактный класс может наследовать другой класс и
реализовывать интерфейсы, а интерфейс может только
наследовать другие интерфейсы

21.

7. Мы можем запустить абстрактный класс, если он имеет метод
main(). Мы не можем запустить интерфейс, потому что у него не
может быть реализации метода main().
8. Интерфейс обеспечивает так называемый контракт для всех
классов, которые реализуют интерфейс. Абстрактный классы —
класс с реализацией метода по умолчанию для подклассов.

22.

Что выбрать?
1. Java не поддерживает множественное наследование,
поэтому каждый класс может наследовать только один суперкласс.
При этом любой класс может реализовать несколько интерфейсов.
Именно поэтому интерфейсы являются лучшим выбором для вашего
проекта. Также написание кода с использованием интерфейсов
является одним из лучших практик программирования на Java.
2. Если вы решили написать много методов, то лучшим решением для
вас будет абстрактный класс. Все дело в том, что мы можем
обеспечить реализацию по умолчанию для некоторых методов,
которые являются общими для всех подклассов.
3. Если мы захотим добавить или удалить метод из интерфейса, то с
этим могут возникнуть проблемы. Все дело в том, что мы не можем
объявить дополнительные методы в интерфейсе без изменения всех
классов, которые реализуют этот интерфейс.

23.

Наследование в двух словах
Наследование extends
Реализация интерфейса implements
English     Русский Правила