Объектно-ориентированное программирование в Java
Вы знакомы с понятиями класса, объекта, конструктора, методов объекта и переменных объекта. Понимаете, что класс определяет методы объекта и что значения переменных экземпляра (объекта) зависят от объекта. Вы знаете, как создавать классы и объекты, а также знаете, как использовать объекты в своих программах.
Теперь мы начнем наше путешествие в мир объектно-ориентированного программирования. Начнем с описания концепций и данных с использованием объектов. С этого момента мы узнаем, как добавить функциональность, то есть методы в нашу программу.
Объектно-ориентированное программирование связано с выделением понятий проблемной области в отдельные сущности и последующим использованием этих сущностей для решения проблем. Концепции, связанные с проблемой, могут рассматриваться только после того, как они были идентифицированы. Другими словами, мы можем формировать абстракции от проблем, которые облегчают подход к этим проблемам.
Как только концепции, связанные с данной проблемой, были определены, мы также можем начать создавать конструкции, которые представляют их в программах. Эти конструкции и отдельные экземпляры, которые из них формируются, т. е. Объекты, используются при решении задачи. Утверждение «программы строятся из небольших, понятных и кооперативных объектов» может пока не иметь большого смысла. Однако по мере прохождения курса это будет казаться более разумным, возможно, даже самоочевидным.
Классы и объекты
Класс определяет атрибуты объектов, т. е. информацию, связанную с ними (переменные экземпляра), и их команды, т.е. их методы. Значения переменных экземпляра (т.е. объекта) определяют внутреннее состояние отдельного объекта, в то время как методы определяют функциональность, которую он предлагает.
Метод — это фрагмент исходного кода, написанный внутри класса, который был назван и имеет возможность вызываться. Метод всегда является частью некоторого класса и часто используется для изменения внутреннего состояния объекта, созданного из класса.
Например, ArrayList — это класс, предлагаемый Java, и мы использовали объекты, созданные из него в наших программах. Ниже создается объект ArrayList с именем integers и к нему добавляются некоторые целые числа.
// мы создаем объект из класса ArrayList с именем integers
ArrayList<Integer> integers = new ArrayList<>();// давайте добавим значения 15, 34, 65, 111 к целым числам объекта
integers.add(15);
integers.add(34);
integers.add(65);
integers.add(111);// мы печатаем размер объекта целых чисел
System.out.println(integers.size());
Объект всегда создается путем вызова метода, который создал объект, т. Е. конструктора с помощью ключевого слова new.
Создание классов
Класс определяет, на что похожи объекты, созданные из него. Переменные объекта (переменные экземпляра) определяют внутреннее состояние объекта. Методы объекта определяют, что делает объект.
Теперь мы познакомимся с созданием наших собственных классов и определением переменной, которая им принадлежит.
Класс определяется как представляющий некоторую значимую сущность, где «значимая сущность» часто относится к реальному объекту или концепции. Если бы компьютерная программа должна была обрабатывать личную информацию, возможно, было бы целесообразно определить отдельный класс Person, состоящий из методов и атрибутов, связанных с человеком.
Давайте начнем. Предположим, что у нас есть шаблон проекта с пустой основной программой:
public class Main {
public static void main(String[] args) {
}
}
Создание нового класса
В NetBeans новый класс можно создать, перейдя в раздел проекты, расположенный слева, щелкнув правой кнопкой мыши создать, а затем класс java. В открывшемся диалоговом окне классу присваивается имя.
Как и в случае с переменными и методами, имя класса должно быть как можно более описательным. Обычно класс продолжает жить и принимает другую форму по мере развития программы. Таким образом, класс, возможно, придется переименовать в какой-то более поздний момент.
Давайте создадим класс с именем Person. Для этого класса мы создаем отдельный файл с именем Person.java. Наша программа теперь состоит из двух отдельных файлов, так как основная программа также находится в своем собственном файле. В Person.java файл изначально содержит определение класса publicclassPerson и фигурные скобки, ограничивающие содержимое класса.
publicclassPerson {
}
После создания нового файла в NetBeans текущее состояние выглядит следующим образом. На изображении ниже человек класса был добавлен в SandboxExercise.
Вы также можете нарисовать диаграмму классов, чтобы изобразить класс. По ходу дела мы познакомимся с его обозначениями. Пустой класс с именем человека выглядит следующим образом:
Класс определяет атрибуты и поведение объектов, созданных на его основе. Давайте решим, что у каждого объекта person есть имя и возраст. Естественно представлять имя в виде строки, а возраст-в виде целого числа.
Мы продолжим и добавим их в наш план:
publicclassPerson {
private String name;
privateint age;
}
Выше мы указываем, что каждый объект, созданный из класса Person, имеет имя и возраст. Переменные, определенные внутри класса, называются переменными экземпляра, полями объектов или атрибутами объектов. Похоже, существуют и другие имена.
Переменные экземпляра записываются в строках, следующих за определением класса publicclassPerson {. Каждой переменной предшествует ключевое слово private. Ключевое слово private означает, что переменные «скрыты» внутри объекта. Это называется инкапсуляцией.
На диаграмме классов переменные, связанные с классом, определяются как «variableName: variableType». Знак минус перед именем переменной указывает на то, что переменная инкапсулирована (у нее есть ключевое слово private).
Теперь мы определили схему — класс — для объекта person. Каждый новый объект person имеет переменные имя и возраст, которые могут содержать значения, относящиеся к конкретному объекту. «Состояние» человека состоит из значений, присвоенных его имени и возрасту.
Определение конструктора
Мы хотим установить начальное состояние для созданного объекта. Пользовательские объекты создаются так же, как и объекты из готовых классов Java, таких как ArrayList, с использованием ключевого слова new. Было бы удобно передавать значения переменным этого объекта по мере его создания. Например, при создании нового объекта person полезно иметь возможность указать ему имя:
publicstaticvoidmain(String[] args) {
Person ada = new Person(«Ada»);
// …
}
Это достигается путем определения метода, который создает объект, т. Е. его конструктора. Конструктор определяется после переменных экземпляра. В следующем примере для класса Person определен конструктор, который можно использовать для создания нового объекта Person. Конструктор устанавливает возраст создаваемого объекта равным 0, а строку, переданную конструктору в качестве параметра в качестве его имени:
publicclassPerson {
private String name;
privateint age;public Person(String initialName) {
this.age = 0;
this.name = initialName;
}
}
Имя конструктора всегда совпадает с именем класса. Класс в приведенном выше примере имеет имя Person, поэтому конструктор также должен быть назван Person. Конструктор также предоставляет в качестве параметра имя создаваемого объекта person. Параметр заключен в круглые скобки и следует за именем конструктора.
За скобками, содержащими необязательные параметры, следуют фигурные скобки. Между этими скобками находится исходный код, который программа выполняет при вызове конструктора (например, newPerson («Ada»)). Объекты всегда создаются с помощью конструктора.
Несколько вещей, которые следует отметить — конструктор содержит выражение this.age = 0. Это выражение устанавливает возраст переменной экземпляра вновь созданного объекта (т. е. возраст «этого» объекта) равным 0. Второе выражение this.name = initialName аналогичным образом присваивает строку, переданную в качестве параметра, имени переменной экземпляра созданного объекта.
Определение методов для объекта
Мы знаем, как создать объект и инициализировать его переменные. Однако объекту также нужны методы, чтобы иметь возможность что-либо делать. Как мы узнали, метод-это именованный раздел исходного кода внутри класса, который может быть вызван.
publicclassPerson {
private String name;
privateint age;public Person(String initialName) {
this.age = 0;
this.name = initialName;
}public void printPerson() {
System.out.println(this.name + «, age » + this.age + » years»);
}
}
Метод записывается внутри класса под конструктором. Имени метода предшествует publicvoid, поскольку метод предназначен для того, чтобы быть видимым внешнему миру (public), и он не возвращает значение (void).
Объекты и статический модификатор
Мы использовали модификатор static в некоторых методах, которые мы написали. Статический модификатор указывает, что рассматриваемый метод не принадлежит объекту и, следовательно, не может использоваться для доступа к переменным, принадлежащим объектам.
В дальнейшем наши методы не будут включать ключевое слово static, если они используются для обработки информации об объектах, созданных из данного класса. Если метод получает в качестве параметров все переменные, значения которых он использует, он может иметь статический модификатор.
В дополнение к имени класса, переменным экземпляра и конструктору диаграмма классов теперь также включает в себя метод printPerson. Поскольку метод поставляется с модификатором public, имя метода имеет префикс со знаком плюс. Для метода не определены параметры, поэтому в скобки метода ничего не помещается. Метод также помечен информацией, указывающей на то, что он не возвращает значение, здесь void.
Метод printPerson содержит одну строку кода, в которой используются имя и возраст переменных экземпляра — диаграмма классов ничего не говорит о его внутренних реализациях. Переменные экземпляра называются с префиксом this. Все переменные объекта видны и доступны из метода.
Давайте создадим троих человек в основной программе и попросим их напечатать себя:
publicclassMain {
public static void main(String[] args) {
Person ada = new Person(«Ada»);
Person antti = new Person(«Antti»);
Person martin = new Person(«Martin»);ada.printPerson();
antti.printPerson();
martin.printPerson();
}
}