Понятие и виды классов Java.
Класс — разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. Другие абстрактные типы данных — метаклассы, интерфейсы, структуры, перечисления — характеризуются какими-то своими, другими особенностями. Наряду с понятием «объекта» класс является ключевым понятием в ООП, хотя существуют и бесклассовые объектно-ориентированные языки, например, Self, Lua. Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен. Точный смысл этой фразы будет раскрыт ниже.
На деле объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию. Графическое представление некоторого количества классов и связей между ними называется диаграммой классов. Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.
Идея классов пришла из работ по базам знаний, имеющих отношение к исследованиям по искусственному интеллекту. Используемые человеком классификации в зоологии, ботанике, химии, деталях машин, несут в себе основную идею, что любую вещь всегда можно представить частным случаем некоторого более общего понятия. Конкретное яблоко — это в целом некоторое яблоко, вообще яблоко, а любое вообще яблоко — фрукт.
Везде далее слова «класс», «объект», «интерфейс» и «структура» будут употребляться в своих специальных значениях, заданных в рамках ООП.
Определение класса на языке Java с помощью оператора class:
class MyClass {
String name = "Example";
// "Конструктор"
public MyClass(String name) {
this.name = name;
}
// "Метод"
public String getName() {
return name;
}
}
Класс это языковая конструкция, определяющая поля данных объектов данного класса (instance variables) и их поведение (methods). Практически класс в Java сам по себе не является объектом. Это лишь шаблон, который определяет, из каких частей будет состоять объект, созданный с помощью этого класса, и как он будет себя вести. Конструкторы.При объявлении класса, возможно, указать методы специального вида, называемые конструкторами и предназначенные для инициализации созданного объекта. Имя этих методов должно совпадать с именем класса, они могут иметь какое-то количество аргументов, например:class Point extends Object {Point() {x = 0.0;y = 0.0;}Point(double x, double y) {this.x = x;this.y = y;}public double x;public double y;}а использованы они могут быть следующим образомPoint a;Point b;a = new Point();b = new Point(1.0, 2.0); Имя this в определении конструктора с аргументами используется для обозначения самого объекта, в методе которого мы находимся, в тех случаях,когда ссылка на этот объект не подразумевается неявно. Методы и посылка сообщений. Если один объект, в программе заставляет другой выполнить какую-то операцию, то принято говорить, что он посылает сообщение другому объекту. Например, можно переопределить класс следующим образом:Pclass Point extends Object {private double x;private double y;public void setX(double x) {this.x = x;}public void setY(double y) {this.y = y;}...}Поля x и y теперь недоступны извне класса, но для изменения их состоянияпредусмотреys специальные методы setX и setY. Финализаторы.Специальное имя finalize зарезервировано для метода, который будет вызван сборщиком мусора перед тем, как объект будет уничтожен. В силу того, что Java освобождает разработчиков от необходимости самим следить за освобождением памяти, занимаемой объектами, необходимость в таких методах обычно возникает лишь тогда, когда надо освободить какие-то внешние ресурсы, например, закрыть открытый файл:protected void finalize() {try {file.close();} catch (Exception e) {}} Производные классы. Наследование классов позволяет создавать новые типы объектов, эффективно использующие функциональность уже существующих типов. Новый тип обычно называется производным классом, а тот, чьи свойства наследуются – базовым классом. Например, можно описать новый класс, соответствующий координатам точки в трехмерном пространстве, на основе уже описанного класса для точки на плоскости.class ThreePoint extends Point {protected double z;ThreePoint() {super();z = 0.0;}ThreePoint(double x, double y, double z) {super(x, y);this.z = z;}}Здесь была добавлена новая координату z, а поля x и y (и методы доступа кним) унаследовали от класса Point. Контроль доступа. Контроль доступа к данным и методам объекта в Java несколько отличается от С++. Помимо трех уровней доступа, имеющихся в С++ (public, private, protected) имеется четвертый, находящийся где-то между уровнями public и protected. Он не имеет имени и используется по умолчанию, когда явно не указан другой уровень. Поля этого типа доступны внутри только одного программного пакета. Пакет представляет группу классов, объединенных в одну логическую группу. Например, классы, описывающие точку и прямоугольник в графическом пакете, могут иметь прямой доступ к полям данных друг друга, запрещенный обычно для остального мира. Также следует отметить, что контроль доступа в C++ помогает программисту лишь при построении программы. Различия между полями, помеченными public и private, отсутствуют в выполняемом модуле, созданном с использованием этого языка. В Java контроль доступа реален, т.к. он осуществляется не только при компиляции, но и непосредственно перед запуском кодов на выполнение виртуальной машиной. Переменные и методы класса.Как и С++ язык Java позволяет использовать переменные и методы, принадлежащие классу целиком. Для определения их используется ключевое слово static. Естественно, что методы самого класса не могут оперировать данными и методами объекта класса, т.к. они не относятся ни к какому определенному объекту. Например, версия реализации класса Rectangle может быть задана следующим образом:class Rectangle extends Object {static final int version = 2 ;static final int revision = 0 ;}Ключевое слово final означает, что значение поля окончательное и изменению не подлежит (это константа). Абстрактные методы.Абстрактные методы - это методы, для которых в данном классе не определена их реализация. Мы указываем лишь на необходимость наличия методов с данным протоколом. Конкретная реализация должна быть осуществлена классами- наследниками. В то же время остальная, "неабстрактная" часть класса может содержать конкретную информацию, которая может быть использована производными классами.Например: abstract class Graphical extends Object{protected Point lowerLeft;protected Point upperRight;...public void setPosition(Point ll, Point ur){ lowerLeft = ll;upperRight = ur;}abstract void drawMyself();}class Rectangle extends Graphical{ void drawMyself(){ ....}}Рис.1.1.1. Модификаторы доступа.
· private члены класса доступны только внутри класса
· package-private или default (по умолчанию) члены класса видны внутри пакета
· protected члены класса доступны внутри пакета и в классах-наследниках
· public члены класса доступны всем