1. Обзор
В этом кратком руководстве мы рассмотрим два основных строительных блока языка программирования Java — классы и объекты. Это базовые концепции объектно-ориентированного программирования (ООП), которые мы используем для моделирования реальных объектов.
В ООП классы — это чертежи или шаблоны объектов. Мы используем их для описания типов сущностей.
С другой стороны, объекты — это живые сущности, созданные из классов. Они содержат определенные состояния в своих полях и представляют определенное поведение своими методами.
2. Классы
Проще говоря, класс представляет определение или тип объекта. В Java классы могут содержать поля, конструкторы и методы.
Давайте рассмотрим пример с использованием простого класса Java, представляющего Car
:
class Car {
// fields
String type;
String model;
String color;
int speed;
// constructor
Car(String type, String model, String color) {
this.type = type;
this.model = model;
this.color = color;
}
// methods
int increaseSpeed(int increment) {
this.speed = this.speed + increment;
return this.speed;
}
// ...
}
Этот класс Java представляет автомобиль в целом. Мы можем создать любой тип автомобиля из этого класса. Мы используем поля для хранения состояния и конструктор для создания объектов из этого класса.
Каждый класс Java по умолчанию имеет пустой конструктор. Мы используем его, если мы не предоставляем конкретную реализацию, как мы сделали выше. Вот как будет выглядеть конструктор по умолчанию для нашего класса Car :
Car(){}
Этот конструктор просто инициализирует все поля объекта значениями по умолчанию. Строки инициализируются нулем
, а целые числа — нулем.
Теперь у нашего класса есть специальный конструктор, потому что мы хотим, чтобы поля наших объектов были определены при их создании:
Car(String type, String model) {
// ...
}
Подводя итог, мы написали класс, который определяет автомобиль. Его свойства описываются полями, содержащими состояние объектов класса, а его поведение описывается с помощью методов.
3. Объекты
В то время как классы транслируются во время компиляции, объекты создаются из классов во время выполнения .
Объекты класса называются экземплярами, и мы создаем и инициализируем их с помощью конструкторов:
Car focus = new Car("Ford", "Focus", "red");
Car auris = new Car("Toyota", "Auris", "blue");
Car golf = new Car("Volkswagen", "Golf", "green");
Теперь мы создали разные объекты Car
из одного класса. Смысл всего этого в том, чтобы определить план в одном месте, а затем повторно использовать его много раз во многих местах.
Пока что у нас есть три объекта Car
, и все они припаркованы, так как их скорость равна нулю. Мы можем изменить это, вызвав наш метод увеличения скорости:
focus.increaseSpeed(10);
auris.increaseSpeed(20);
golf.increaseSpeed(30);
Теперь мы изменили состояние наших автомобилей — все они движутся с разной скоростью.
Более того, мы можем и должны определить контроль доступа к нашему классу, его конструкторам, полям и методам. Мы можем сделать это, используя модификаторы доступа, как мы увидим в следующем разделе.
4. Модификаторы доступа
В предыдущих примерах мы опустили модификаторы доступа, чтобы упростить код. Таким образом, мы фактически использовали модификатор package-private по умолчанию. Этот модификатор разрешает доступ к классу из любого другого класса в том же пакете.
Обычно мы использовали модификатор public
для конструкторов, чтобы разрешить доступ из всех других объектов:
public Car(String type, String model, String color) {
// ...
}
Каждое поле и метод в нашем классе также должны были определять контроль доступа с помощью определенного модификатора. Классы обычно имеют общедоступные
модификаторы, но мы склонны держать наши поля закрытыми
.
Поля содержат состояние нашего объекта, поэтому мы хотим контролировать доступ к этому состоянию. Мы можем оставить некоторые из них частными
, а другие общедоступными
. Мы достигаем этого с помощью специальных методов, называемых геттерами и сеттерами.
Давайте посмотрим на наш класс с полностью определенным контролем доступа:
public class Car {
private String type;
// ...
public Car(String type, String model, String color) {
// ...
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSpeed() {
return speed;
}
// ...
}
Наш класс помечен как public
, что означает, что мы можем использовать его в любом пакете. Кроме того, конструктор является общедоступным
, что означает, что мы можем создать объект из этого класса внутри любого другого объекта.
Наши поля помечены как private
, что означает, что они не доступны из нашего объекта напрямую , но мы предоставляем доступ к ним через геттеры и сеттеры.
Поля типа
и модели
не имеют геттеров и сеттеров, потому что они содержат внутренние данные наших объектов. Мы можем определить их только через конструктор при инициализации.
Кроме того, можно получить доступ к цвету и изменить его, тогда как к
скорости
можно получить доступ, но не изменить. Мы принудительно корректировали скорость с помощью специализированных общедоступных
методов увеличения скорости()
и уменьшения скорости()
.
Другими словами, мы используем контроль доступа для инкапсуляции состояния объекта.
5. Вывод
В этой статье мы рассмотрели два основных элемента языка Java, классы и объекты, и показали, как и почему они используются. Мы также представили основы управления доступом и продемонстрировали его использование.
Чтобы изучить другие концепции языка Java, мы предлагаем в качестве следующего шага прочитать о наследовании , ключевом слове super и абстрактных классах .
Полный исходный код примера доступен на GitHub .