Глава 2. Создание и использование классов в Java.
Создание класса на языке Java.
Создавать класс мы будем в программе Ecllipse. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.
Cоздадим в нашем проекте новый класс под именем Сat. Для этого в меню Ecllipse выберем File -> new -> class и, в открывшемся окне, введем имя класса –Сat при этом класс должен начинаться с большой буквы. (рис 2.1.1).
Рис 2.1.1.
В итоге, у нас создался новый класс (рис 2.1.2).
Рис 2.1.2.
Структура класса в java
Класс в java оформляется с помощью следующей конструкции:
public class Cat {
}
Рассмотрим ее составляющие:
public – модификатор доступа к классу, в данном случае он нам говорит, что этот класс будет доступен не только данному классу, но и другим. В java существуют и другие модификаторы.
class – ключевое слово, говорящее о том, что это класс.
Cat – имя класса. Имена классов принято писать с заглавной буквы.
{ } – фигурные скобки, между которыми разместится тело нашего класса.
Классы Java состоят из атребутов и методов, присвою некоторые из них классу Cat.
Атрибуты класса Сat
Атрибутами кота могут быть: имя, вес, окраска. Атрибуты это переменные, которые объявляются следующим образом:
private int weight; // вес кота
private String name; // имя кота
private String color; //окрас кота
private – здесь опять же указывает на права доступа. К переменной, в данном случае, можно обращаться только из ее класса, чтобы классы извне не могли ее изменить .
int, String – это типы данных. В данном случае вес будет задан при помощи целого числа – int, a имя и цвет при помощи символьной строки String.
После объявления каждого атрибута должна ставиться точка с запятой ;
При помощи // в коде программы оформляются комментарии, которые являются правилом хорошего тона.
Методы класса Сat
Пусть наш кот умеет, есть, спать и разговаривать. Опишем это поведение с помощью методов.
//кот ест
public void eat(){
System.out.print("Eating...\n");
}
public void eat() – сигнатура метода, его определение. В данном случае она нам говорит о том, что:
метод eat() доступен для других классов – public;
метод eat() не возвращает никаких данных – void.
eat – имя метода. Имена методов, в отличие от имен классов, принято писать с маленькой буквы. На конце каждого метода после имени всегда идут круглые скобки ( ), пустые или содержащие параметры (об этом позднее).
После сигнатуры метода идут фигурные скобки { }. В них содержится тело метода. Тело нашего метода содержит просто вывод сообщения о том, что кот кушает —"Eating...\n". За вывод текстового сообщения отвечает метод System.out.print("Eating...\n").
\n — символ перевода строки, чтобы при выводе наших сообщений все они не писались в одну строку.
Аналогично предыдущему методу опишем спящего кота:
//кот спит
public void sleep(){
System.out.print("Sleeping zz-z-z-z...\n");
}
И немного иначе опишем метод – кот говорит:
//кот говорит
public String speak(String words){
String phrase = words + "...mauu...\n";
return phrase;
}
В отличие от предыдущих методов этот метод возвращает значение и имеет входные параметры. Давайте подробнее рассмотрим сигнатуру метода public String speak(String words):
public - метод speak() доступен для других классов;
String — тип значения, которое возвращает метод. В предыдущих случаях ключевое словоvoid указывало на то, что метод ничего не возвращает. В данном случае String указывает на то, что метод возвращает значение типа строка.
В процессе своей работы метод выполняет определенные действия над данными. Иногда необходимо, чтобы результат этих действий был передан для дальнейшей обработки другим классам, в этом случае метод передает (возвращает) этот результат. Эти возвращаемые данные относятся к какому-либо типу. В нашем примере это тип символьной строки, String.
Возвращающие методы должны содержать в своем теле ключевое слово return, которое указывает на то, что именно возвращает данный метод. В нашем случае это переменнаяphrase.
speak - имя метода.
(String words) — входные параметры. Входные параметры — это какие-либо данные, которые передаются из других классов и, которые метод должен обработать. Наш метод получает в качестве входных данных строку в виде переменной words, к этой строке дописывает «...mauu...» и возвращает то, что получилось.
В итоге класс Cat выглядит следующим образом:
public class Cat {
private int weight; // вес кота
private String name; // имя кота
private String color; //окрас кота
//кот ест
public void eat(){
System.out.print("Eating...\n");
}
//кот спит
public void sleep(){
System.out.print("Sleeping zz-z-z-z...\n");
}
//кот говорит
public String speak(String words){
String phrase = words + "...mauu...\n";
return phrase;
}
}
Обращение к классу в Java
Далее рассмотрим обращение к классу Cat. И то, как его использовать в работе.
Удалим строку System.out.println("Hello World"); , чтобы у нас осталось только следующее (рис 5.3).:
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
}
}
Прежде чем вызывать созданные нами методы в классе Cat и заставить нашего кота есть,спать и говорить, сперва нужно создать экземпляр класса (инстанцию).
Cat ourcat = new Cat();
Данная строчка нам говорит о том, что в памяти создан экземпляр объекта Cat, а переменная ourcat типа Cat (такого же, как и наш объект) указывает на то место в памяти, где был этот объект создан.
Рис. 2.1.3
В качестве результата внизу в консоли мы получаем следующие строки.
Eating...
Sleeping zz-z-z-z...
Play with me...mauu...
Рис. 2.1.4.
В этой главе я показал, как создаются классы в Java. Как объявлять атрибуты и методы класса. Методы могут возвращать или не возвращать значения, иметь или не иметь входных параметров.
Методы в классах Java.
Метод определяется, как действительная реализация некоторой операции с объектом.
Например:
access_specifier modifier datatype method_name (parameter_list)
{
// тело метода
}
Метод всегда вызывается относительно одного из объектов соответствующего класса. Внутри метода нет необходимости повторно определять текущий объект.
Пример использования метода:
|
Методы возвращают значения в вызывающую программу с помощью оператора return. Многие методы требуют передачи им параметров.
Параметры позволяют обобщить применение метода. void – невозвращаемый значение тип метода.
Передача по значению
n Передача по значению означает, что, когда мы вызываем метод, передаем копию значения каждого фактического параметра методу.
n Можем изменить эту копию в методе, но это никак не отразиться на фактическом параметре.
int x=5;
doStuff(x);
…
void doStuff (int y) {
использование у
}
Ссылка this
n Ключевое слово this связано с объектом.
n Оно используется, чтобы указать текущий объект.
int x;
PassTest (int x) {
this.x=x;
}
Модификаторы доступа
n Модификаторы управления доступом определяют правила доступа к полям или методам.
n По умолчанию переменные, методы и классы имеют тип protected.
public | общий доступ, для любых объектов и извне |
private | частный доступ, только из методов данного класса |
private protected | защищенный доступ, только из методов данного класса и его производных классов |
protected | защищенный доступ, из методов данного класса и его производных классов, а также из классов, определенных в том же пакете (каталоге) |
Преимущества методов:
n Методы обеспечивают доступ к данным класса. Нельзя обращаться непосредственно к данным объекта, к ним можно обратиться только через методы.
n Программа может быть разделена логически.
n Нет никакой потребности, повторять один и тот же набор конструкций снова и снова. Можно объявить отдельный метод, который будет вызываться, когда потребуется.
n Программы становятся легко отлаживаемые.
Типы методов:
Перегруженные методы – это методы, которые находятся в том же самом классе и имеют то же самое имя, но различные списки параметров.
public void add (int a, int b){
int c=a+b;
System.out.println(c);
}
public void add (float a, float b){
float c=a-b;
System.out.println(c);
}
Переопределенные методы – это методы, которые находятся в суперклассе так же как и в подклассе.
Замещение и перегрузка методов
Характеристики замещаемых методов:
Определяются как в суперклассе, так и в подклассе. Переопределяются в подклассе.
Характеристики перегружаемых методов:
Определены в одном и том же классе, имеют одно и то же имя, имеют различные списки параметров
Объектная инициализация
n В начале создания объекта JVM распределяет достаточное место в динамической области памяти, чтобы разместить переменные образца объекта.
n Когда память распределена, в ней могут содержаться различные типы данных.
Перегрузка конструктора
n Перегрузка конструктора обеспечивает способ создания объектов с или без начальных параметров, в зависимости от необходимости.
public class PassTest {
PassTest (){
….
}
PassTest (int x) {
….
}
…
PassTest test1= new Passtest();
PassTest test2=new Passtest (10);
Наследование
n Не менее важной характеристикой объектно-ориентированного языка программирования является наследование.
n Суть наследования состоит в создании производного класса, который имеет возможности базового класса плюс свои собственные возможности.
n Говорят, что производный класс расширяет (extends) базовый класс.
n Любой производный класс может расширять только один базовый класс.
Набор атрибутов класса наследуется всеми подклассами, определёнными, как производные от этого класса.
Класс, который получен наследованием от другого класса, называется подклассом (subclass).
Класс, от которого получен наследованием другой класс, называется суперклассом (superclass).
Подкласс (Subclass) является специализацией суперкласса (superclass) и может получать доступ ко всем экземплярам переменных и методов, определённых в суперклассе.
Чтобы выполнить наследование класса, необходимо использовать ключевое слово extends в определении подкласса.
class Programmer extends Employee { }
Класс Object
n Класс Object не является ничьим наследником, от него начинается иерархия любых классов Java.
n Метод equals() сравнивает содержимое объектов в их текущем состоянии, фактически он реализован в классе Object как тождество: объект равен только самому себе.
n Второй метод класса Object, который следует переопределять в подклассах, — метод toString (). Это метод без параметров, который пытается содержимое объекта преобразовать в строку символов и возвращает объект класса String.
Ключевое слово super
n В производном классе функции базового класса могут быть переопределены. При использовании переопределенных функций в производных классах может возникнуть необходимость явно вызвать функцию базового класса. Для этого используется выражение:
super.имяФункции(параметры);
n Ключевое слово super предназначено для вызова конструктора суперкласса.
n Ключевое слово super может быть также использовано для обращения к методам или экземплярам переменных суперкласса.
Пакеты все классы Java распределяются по пакетам.
Пакет- это совокупность классов, интерфейсов и других пакетов. Каждый пакет образует одно пространство имен (namespace). Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Чтобы создать пакет надо просто в первой строке Java-файла с исходным кодом записать строку package имя: package mypack;
Включение пакета
n Синтаксис команды включения пакета: import package_name.*;
n Символ * используется, чтобы импортировать все классы текущего пакета.
n Чтобы включить определенный класс/интерфейс, найденный в пакете используют: import package_name.class_name;
Объявление методов
Методы - это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне, что и переменные объектов. При объявлении метода задаются тип возвращаемого им результата и список параметров. Общая форма объявления метода такова:
тип имя_метода (список формальных параметров) {
тело метода:
}
Тип результата, который должен возвращать метод может быть любым, в том числе и типом void - в тех случаях, когда возвращать результат не требуется. Список формальных параметров - это последовательность пар тип-идентификатор, разделенных запятыми. Если у метода параметры отсутствуют, то после имени метода должны стоять пустые круглые скобки.
class Point { int х, у;
void init(int a, int b) {
х = а;
У = b;
} }
Вызов метода
В Java отсутствует возможность передачи параметров по ссылке на примитивный тип. В Java все параметры примитивных типов передаются по значению, а это означает, что у метода нет доступа к исходной переменной, использованной в качестве параметра. Заметим, что все объекты передаются по ссылке, можно изменять содержимое того объекта, на который ссылается данная переменная.