В предыдущем уроке мы познакомились с такими понятиями как объект и класс, а также другими важными понятиями объектно-ориентированного программирования: абстракцией, инкапсуляцией, наследованием и полиморфизмом.
Но давайте перейдем от теории к практике и научимся создавать объект в java. В этом уроке будет рассмотрено создание класса на языке java и последующее обращение к этому классу, то есть мы научимся основам работы с классами.
Создание класса в java
Создавать класс мы будем в программе Ecllipse, но также можно работать в любой другой IDE или в блокноте. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.
Вспомним урок 3, и создадим в нашем проекте новый класс под именем Сat. Для этого в меню Ecllipse выберем File -> new -> class и, в открывшемся окне, введем имя класса – Сat (обязательно с большой буквы!). Обратите внимание, что галочка public static void main (String[] args) должна быть снята! Затем нажмем Finish (рис 5.1).
В итоге, у нас создался новый класс (рис 5.2).
Структура класса в java
Класс в java оформляется с помощью следующей конструкции:
public class Cat { }
Рассмотрим ее составляющие:
public – модификатор доступа к классу, в данном случае он нам говорит, что этот класс будет доступен не только данному классу, но и другим. В java существуют и другие модификаторы, но об этого поговорим позднее.
class – ключевое слово, говорящее о том, что это класс.
Cat – имя класса. Имена классов принято писать с заглавной буквы.
{ } – фигурные скобки, между которыми разместится тело нашего класса.
В предыдущем уроке мы упоминали, что классы в java состоят из атрибутов и методов, присвоим некоторые и нашему коту.
Атрибуты класса Сat
Атрибутами кота могут быть: имя, вес, окраска. Атрибуты это переменные, которые объявляются следующим образом:
private int weight; // вес кота private String name; // имя кота private String color; //окрас кота
private – здесь опять же указывает на права доступа. К переменной, в данном случае, можно обращаться только из ее класса, чтобы классы извне не могли ее изменить (вспомним инкапсуляцию из урока 4).
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. И то, как его использовать в работе.
Перейдем в класс HelloWorld, который мы создавали в уроке 3 и немного его модифицируем. Удалим строку System.out.println("Hello World"); , чтобы у нас осталось только следующее (рис 5.3).:
public class HelloWorld { /** * @param args */ public static void main(String[] args) { } }
Если вы не проходили урок 3 и не создавали класс HelloWorld, то вам его нужно создать: File -> new -> class, ввести в открывшемся окне имя класса и в этот раз обязательно установить галочку public static void main(String[] args).
public static void main(String[] args) – сигнатура метода main(). Программа состоит из нескольких классов, но только один из классов может содержать метод main(). Mетод main(), это так называемая точка входа в программу. Без этого метода мы не сможем стартовать программу. Теперь, вместо приветствия миру, этот метод будет содержать код для работы с классом Cat.
Пишем в тело метода main() (между его фигурными скобками) следующие строки:
Cat ourcat = new Cat(); ourcat.eat(); ourcat.sleep(); String say = ourcat.speak("Play with me"); System.out.println(say);
Разберем подробнее, что это значит.
Прежде чем вызывать созданные нами методы в классе Cat и заставить нашего кота есть, спать и говорить, сперва нужно создать экземпляр класса (инстанцию).
Cat ourcat = new Cat();
Данная строчка нам говорит о том, что в памяти создан экземпляр объекта Cat, а переменная ourcat типа Cat (такого же, как и наш объект) указывает на то место в памяти, где был этот объект создан.
Переменную ourcat теперь можно использовать для вызова методов класса Cat, например:
ourcat.eat(); ourcat.sleep();
При вызове этих методов в программе Eclipse удобно пользоваться комбинацией клавиш
Ctrl + пробел, после введения имени переменной и точки (рис 5.4). Программа подскажет, какие можно использовать методы для данной переменной.
Если метод возвращает какое-либо значение, например, как наш метод speak() возвращает значение типа String, то его можно вызывать следующим образом:
- объявить переменную такого же типа, что и возвращаемое значение (в нашем случае String)
- присвоить ей вызванный метод, например:
String say = ourcat.speak("Play with me");
Вспомним, что при описании нашего метода он содержал параметры speak(String words). Теперь, при вызове в качестве параметра выступила фраза "Play with me", метод speak() ее обработал и вернул "Play with me...mauu...". Именно это значение он присвоил переменной say.
Мы это можем проверить, выведя say на печать при помощи команды:
System.out.println(say);
Итак, наш класс HelloWorld теперь выглядит следующим образом:
public class HelloWorld { /** * @param args */ public static void main(String[] args) { Cat ourcat= new Cat(); ourcat.eat(); ourcat.sleep(); String say = ourcat.speak("Play with me"); System.out.println(say); } }
Теперь сохраним (Ctrl+Shift+S или ) и запустим () нашу программу. При запуске Eclipse может предложить выбрать Java Applet или Java Application. Нужно выбрать Java Application (рис 5.5).
В качестве результата внизу в консоли мы получаем следующие строки.
Eating... Sleeping zz-z-z-z... Play with me...mauu...
На этом закончим данный урок, итак, в этом уроке мы:
- Научились создавать класс в java.
- Научились объявлять атрибуты и методы класса.
- Узнали, что методы могут возвращать или не возвращать значения, иметь или не иметь входных параметров.
- Узнали что такое метод main().
- Научились создавать экземпляр класса и вызывать его методы, то есть работать с созданным объектом.
Для закрепления материала предлагаю самостоятельно создать класс Dog, где описать характеристики и поведение собаки, а потом вызвать этот класс из HelloWorld. Свои вопросы можете оставлять в комментариях.
И сразу второй вопрос: если я хочу чтобы в методе speak вызвращалось несколько параметров, как мне их надо прописать?
зависит от того, что вы хотите сделать. Вообще в методе можно вернуть только один параметр, еали хотите возвращать несколько, то для этого нужно создавать специальный класс.
Очень грамотное изложение. Спасибо. Не всё понятно, конечно, но это лучшее для новичков.
Одно лишь пожелание в конце выкладывать окончательный код собранный на уроке для сверкию
Отличное изложение.
Можно поподробнее рассказать про:
«Cat ourcat = new Cat();»
Почему в данной строчке фактически два раза идет упоминание класса Cat?
На примере Питона — экземпляр класса объявляется как ourcat = Cat()
Ну джава и питон разные языки, и синтаксис у них разный. Джава — строго типизированный язык, поэтому при объявлении переменной всегда указывается ее тип. В нашем случае типом является класс Cat (Сat ourcat;). Потом переменной присваивается экземпляр класса, который создается при помощи new Cat(); где Cat() это конструктор (метод класса, который инициализирует новый объект после его создания). Имя конструктора в джаве всегда совпадает с именем класса, поэтому два раза и упоминание, в первом случае это указание класса, в другом — конструктора.
На мой взгляд, в такой записи присутствует некая избыточность. Ну да ладно, хозяин — барин 🙂 Спасибо за ответ!
В следующем (J-6) уроке я увидел такие строчки:
//Создание строки с помощью конструктора
String myString = new String(«The weather was fine»);
//Можно также создать строку используя кавычки «»
String myString = «The weather was fine»;
Применимо ли это к нашей ситуации? Можно ли записать нашу строчку как Cat ourcat = Cat(); ?
ну про избыточность спросите у основателей языка)) Ответ на второй вопрос — нет, это только у класса String такое возможно. Экземпляр любого класса создается только с использованием ключевого слова new. Единственное исключение – экземпляры класса String, для него в добавок определены строковые литералы при помощи которых также можно создать экземпляр
Спасибо за ответы! Полистал комментарии и понял, что не меня одного смутила эта запись 🙂 И нашел более удобовариемое ваше объяснение:
Мария (admin):
Май 14, 2014 в 10:07 пп
…
2. В языке Java нельзя не указывать тип. Если не укажете, то компилятор будет ругаться, что вы не объявили переменную ourcat (можете попробовать — увидите ошибку). Но можно запись разделить на 2.
Cat ourcat; // объявили переменную типа Cat (Переменная ourcat на данный момент содержит значение NULL)
ourcat = new Cat(); // создали экземпляр класса Cat (Переменной ourcat присваивается экземпляр класса Cat)
Зачем нам указывать атрибуты если они не используются?… Или я чтот не понял?!…(я про данный пример)
в данном примере атрибут указывается только в методе speak(), там он используется
Я про имя, вес и окрас…
Неправильно вас поняла изначально. В данном примере атрибуты класса указаны лишь с ознакомительной целью, чтобы показать, что у класса могут быть атрибуты и методы. Их использование я пока намеренно не стала включать в урок, потому что в дальнейшем хочу выделить это в отдельную тему — использование геттеров и сеттеров, при помощи которых к атрибутам предоствляется доступ из других классов. Но вы можете пофантазировать и как-нибудь их использовать, или удалить, на работе программы это не скажется.
Благодарю за ответ!