Урок J-5. Создание класса и обращение к нему в Java

В предыдущем уроке мы познакомились с такими понятиями как объект и класс, а также другими важными понятиями объектно-ориентированного программирования: абстракцией, инкапсуляцией, наследованием и полиморфизмом.

Но давайте перейдем от теории к практике и научимся создавать объект в java. В этом уроке будет рассмотрено создание класса на языке java и последующее обращение к этому классу, то есть мы научимся основам работы с классами.

Создание класса в java

Создавать класс мы будем в программе Ecllipse, но также можно работать в любой другой IDE или в блокноте. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.

Вспомним урок 3, и создадим в нашем проекте новый класс под именем Сat. Для этого в меню Ecllipse выберем  File -> new  -> class  и, в открывшемся окне, введем имя класса – Сat (обязательно с большой буквы!). Обратите внимание, что галочка public static void main (String[] args) должна быть снята! Затем нажмем Finish (рис 5.1).

lesson5_classcat

Рис 5.1.

В итоге, у нас создался новый класс (рис 5.2).

lesson5_classcat2

Рис 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) {

        }
}
lesson5_classcat3

Pис 5.3.

 

Если вы не проходили урок 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). Программа подскажет, какие можно использовать методы для данной переменной.

lesson5_eclipse

Рис. 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 или saveall) и запустим (play) нашу программу. При запуске Eclipse может предложить выбрать Java Applet или Java Application. Нужно выбрать Java Application (рис 5.5).

lesson5_javaapplication

Рис. 5.5

В качестве результата внизу в консоли мы получаем следующие строки.

Eating...
Sleeping zz-z-z-z...
Play with me...mauu...
lesson5_result

Рис. 5.6.

 

На этом закончим данный урок,  итак, в этом уроке мы:

  • Научились создавать класс в java.
  • Научились объявлять атрибуты и методы класса.
  • Узнали, что методы могут возвращать или не возвращать значения, иметь или не иметь входных параметров.
  • Узнали что такое метод main().
  • Научились создавать экземпляр класса и вызывать его методы, то есть работать с созданным объектом.

Для закрепления материала предлагаю самостоятельно создать класс Dog, где описать характеристики и поведение собаки,  а потом вызвать этот класс из HelloWorld.  Свои вопросы можете оставлять в комментариях.

Комментарии и пинги к записи запрещены.

Комментариев к записи: 115

  1. V01D:

    String name = «Barsik»;
    int weight = 4;
    String color = «black»;

    Нет?

    • Мария (admin):

      Нет, тип переменных (int, String) мы уже задали в самом начале класса Cat (при объявлении этих переменных), в методе aboutCat() мы присваиваем значения этим переменным.

      Но можете эти значения присвоить еще в самом начале, при объявлении переменных. Тогда в методе aboutCat() строки с присвоением значений переменных уже не нужны.

  2. Andrew:

    Помогите решить болле правильно задание:

    public class Proba1 {

    public static void main(String args[]) {
    Oper op = new Oper();
    op.a = 6;
    op.b = 7;
    System.out.println("Сумма=" + op.sum());
    System.out.println("Разность=" + op.dif());
    }

    }

    Это незаконченная программа. Разберем ее построчно, определим, что означает каждый оператор.

    В программе используется класс Oper, который не реализован. Задача состоит в реализации этого класса. В частности, нужно определить

    1. В каком файле разместить этот класс.
    2. Какие поля должен содержать этот класс.
    3. Какие методы должны быть в нем реализованы.

    ВОт варианты решения — нашёл способ .как его решить , но сам сделал по другому. Вот способ который я нашёл

    public class Proba1 {

    public static void main(String args[]) {
    Oper op = new Oper();
    op.setA(6);
    op.setB(7);
    System.out.println("Сумма=" + op.sum());
    System.out.println("Разность=" + op.dif());
    }

    }

    public class Oper{
    private int a = 0;
    private int b = 0;
    public void setA(int a){
    this.a=a;
    }
    public int getA(){
    return a;
    }
    public void setB(int b){
    this.b=b;
    }
    public int getB() {
    return b;
    }
    public int sum(){
    return (a+b);
    }
    public int dif(){
    return (a-b);
    }
    }

    А вот как сделал я :

    public class Proba1 {

    public static void main(String args[]) {
    Oper op = new Oper();
    op.setA(6);
    op.setB(7);
    System.out.println("Сумма=" + op.sum());
    System.out.println("Разность=" + op.dif());
    }

    }

    public class Oper{
    private int a = 0;
    private int b = 0;
    public void setA(int a){
    this.a=a;
    }

    public void setB(int b){
    this.b=b;
    }

    public int sum(){
    return (a+b);
    }
    public int dif(){
    return (a-b);
    }
    }

    почему в первом способе пишут этот метод ?
    public int getA(){
    return a;
    }

    ведь всё работает и без него…

    Заранее спасибо

    • Мария (admin):

      Добрый день, все работает без getA() потому, что вы просто его не используете в своей программе и не вызываете в классе Proba1. getA() и setA() — так называемые геттер и сеттер используются для изменения/получения значения переменной другого класса, чтобы не обращаться к переменной напрямую. С помощью сеттера можно присвоить значение переменной, с помощью геттера получить значение переменной. Думаю, что это просто правило хорошего тона, указывать к переменой и гетер и сеттер, даже в случае, если что-то из этого не будет использовано. Иначе получается половичный доступ к переменной и программа теряет свою универсальность, ведь вы можете модернизировать свою программу, и вам понадобится получать значение переменной.

      • Andrew:

        То есть в public void setA setA не просто название метода и если я напишу к примеру public void carA ничего не сработает ?

        • Мария (admin):

          Сработает, но set и get это стандартные обозначения для такого рода методов. Их даже можно генерировать автоматически в IDE. Прочитайте подробнее про сеттеры и геттеры, например на википедии, у меня пока к сожалению нет урока по ним
          http://ru.wikipedia.org/wiki/Геттер_(программирование)
          http://ru.wikipedia.org/wiki/Setter

          • Andrew:

            Спасибо за ответы , но тогда зачем добавлять слово this ?
            public void setB(int b){
            this.b=b;
            }

          • Мария (admin):

            Я думаю, вам нужно сначала прочитать учебник по программированию, а потом программировать, иначе будут одни вопросы))
            Объясню на примере из википедии. Имеем класс ScheduleTask

            public class ScheduleTask {

            private int hours;

            public void setHours(int hours) {
            if ((hours >= 0) && (hours < 24)) this.hours = hours; } }

            в этом классе имеем переменную int hours и метод setHours в котором передаем параметр тоже int hours. Так вот, это 2 разные переменные (глобальная и локальная), по идее мы можем назвать их по разному, но опять же, так не принято. Когда мы пишем this.hours то это значит мы указываем на ту переменную, которая описана в начале класса (на глобальную), а когда пишем hours, то имеем ввиду переменную, которая передана в качестве параметра в методе. Таким образом мы присваиваем переменной класса значение передаваемого параметра. Если мы напишем просто hours = hours, то это значит, что мы присвоили переменную метода самой себе, из за этого значение глобальной переменной в классе не изменится.

  3. Andrew:

    Мария большое Вам спасибо ,теперь всё стало на свои места. Просто ещё нужно понять ,что this это заимствованное слово , а не просто из головы.И пока что я не пытаюсь программировать,а только учусь и параллельно вашему материалу изучаю http://www.javable.com/tutorials/fesunov/lesson3/#%3F%3F%3F%3F%3F%3F%3F%3F+%3F%3F%3F%3F%3F+this Только здесь всё очень сложно и некоторые моменты толком не объяснены

  4. Andrew:

    ТО есть если же глобальная переменная была бы паблик , то не нужно было задавать параметры методу( параметры метода- это синоним определению «локальная переменная». да ? ) и всё выглядело вот так :

    public class ScheduleTask {

    public int hours;

    public void setHours() {
    if ((hours >= 0) && (hours < 24))
    }
    }

    • Мария (admin):

      Нет, все не так, если переменная паблик, то геттеры и сеттеры вообще не нужны, так как к ней можно обратиться из любого класса непосредственно, например так

      SheduleTast task = new SheduleTas();
      task.hours = 10;

      Но это плохо, когда переменная паблик и ее так вот может кто угодно напрямую менять. Поэтому переменные должны быть приватными а для доступа к ним используются геттеры и сеттеры.

      SheduleTast task = new SheduleTas();
      task.setHours(10);

      Тот метод который вы написали не делает абсолютно ничего. Во первых он не содержит параметр в скобках, следовательно в него нельзя передать значение, во воторых даже если его вызвать и допустим выполнится условная конструкция, то произойдет Ничего! Потому что после if никакого кода нет. If это своего рода переключатель. Если выполняется условие, то дальше идет выполнение кода, стоящего после условия, если не выполняется, то выполняется другой кусок кода или не выполняется ничего. А в вашем примере вы просите программу выполнить ничего или ничего 🙂

      Теперь о глобальных и локальных переменных вкратце.
      Глобальная переменная это та, которая определяется в самом классе, вне методов, в итоге все методы в классе могут использовать ее. Для нее нужно указывать видимость public или private, если неуказано, то по умолчанию считается паблик. Локальная переменная это та, которая определяется внутри метода, и действует она тоже только в рамках метода, если эту переменную использовать в другом методе, то джава этого не поймет и будет кричать, что переменная неопределена. Для локальных переменный не указывается паблик и приват.
      Та переменная, которая стоит в скобках метода называется параметром и используестся она тоже локально в рамках метода. Параметр нужен для того чтобы передавать в метод какие-то данные из вне для обработки. Ну это так в кратце, вообще это тема для отдельного урока.

  5. Andrew:

    И вот я ещё это задание сделал по вашему примеру :
    public class Probka {
    public static void main(String args[]) {
    Opera op = new Opera();
    int say = op.sum(6);
    System.out.println(say);
    Opera dop = new Opera();
    int day = dop.dif(6);
    System.out.println(day);

    }

    }

    public class Opera {
    public int sum(int number){
    int summa = number + 7;
    return summa;

    }
    public int dif(int number){
    int summa = number — 7;
    return summa;

    }

    }
    Результат тот же -единственное пока не знаю как добавить сюда строки : Сумма= и Разность= и возможно ли это вообще ))) или же этот вариант решения абсолютно не правилен…

    • Мария (admin):

      Непонятно, зачем вы два раза создаете объект
      Opera op = new Opera();
      Opera dop = new Opera();

      достаточно только одного.
      Еще мне не очень нравится запись
      int say = op.sum(6);
      Вы объявляете переменную и сразу инициализруете ее итоговым значением, как то надо постепенно. Я бы написала так

      Opera op = new Opera();
      int summation, difference;
      summation = op.sum(6);
      difference = op.dif(6);
      System.out.println("Сумма = " + summation + " Разность = " + difference );

      В классе Opera внутри метода я бы исправила так
      int summa;
      summa = number + 7;
      return summa;

      Вы когда объявляете переменную типа int blablabla вы можете ей присвоить начальное значение, например int blablabla=0; Но у вас то сумма это итог, не нужно его сразу при инициализации присваивать. В данном примере может и не сказывается на результате, но в более сложном скажется.

Все материалы сайта study-java.ru являются результатом труда его авторов. Копирование материалов в некоммерческих целях без указания источника в виде прямой ссылки на сайт study-java.ru запрещено. Использование материалов в коммерческих целях разрешено только с письменного согласия автора. Нарушение авторских прав преследуется по закону.