Руководство по Java Core. Объекты и классы.

Java является Объектно-ориентированным (далее ОО) языком программирования. Следовательно, в работе мы будем оперировать следующими понятиями:

  • Класс
  • Объект
  • Экземпляр
  • Метод
  • Наследование
  • Полиморфизм
  • Инкапсуляция

В этом уроке мы рассмотрим первые два пункта: Класс и Объект.

  • Класс
    Сущность, которая характеризуется полями (аттрибутами) и поведением (методами). Например, разработчик имеет имя, фамилию, специализацию, зарплату и т.д.
  • Объект
    Объект – это экземпляр класса. Например, конкретный разработчик.
    Имя: Иван
    Фамилия: Иванов
    Специализация: Java – разработчик
    Зарплата: 100500 долларов в час

Давайте рассмотрим более подробно классы, объекты и из чего они состоят.


Объекты

Если посмотрим на реальный мир, то увидим, что нас окружают объекты – Люди, Звери, Птицы, Машины и т.д. Всё это объекты, которые имеют свои свойства и поведение.

Например, человек имеет рост, вес, имя, цвет волос, цвет глаз и так далее. Человек также имеет определённое поведение. Он дышит, видит, слышит, говорит и т.д.

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


Класс

Класс сущность, экземпляром которой является объект. Например, объектом класса Человек будет конкретный человек – Иванов Иван Иванович. Другими словами, Иванов Иван Иванович – это объекта класса человек.

Класс может включать в себя:

  • Локальные переменные
    Это переменные, которые определяются внутри методов или конструкторов. Т.е. переменная объявляется внутри метода и уничтожается после того, как программа завершает выполнение метода.
  • Переменные экземпляра
    Это переменные, которые объявляются внутри класса, но не внутри метода. Эти переменные инициализируются в момент создания экземпляра класса (инициализации).
  • Переменные класса
    Это переменные, которые объявляются внутри класса, вне метода с помощью ключевого слова static.

Класс может иметь любое количество переменных и методов. Методы выглядят, примерно, так:

breath()

walk()


Конструкторы

Наиболее важной частью обсуждения классов являются конструкторы. Любой класс в Java имеет конструктор. Даже если мы не прописываем его, то компилятор Java сам создаёт для этого класса конструктор по умолчанию.

Каждый раз, когда мы создаём новый объект (экземпляр класса), запускается конструктор. Главное правило для конструкторов – они должны иметь такое же имя, как и сам класс.

Пример простого конструктора:


package net.proselyte.javacore.objects;

public class Person {
    private String name;

    /**
     * Default constructor
     * */
    public Person() {
    }

    /**
     * Constructor that has parameter name
     * */
    public Person(String name) {
        this.name = name;
    }
}


Создание объекта

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

Создание объекта состоит из трёх этапов:

  • Декларация
    Декларирование переменной типа класса с уникальным именем.
  • Инстанциация
    Создание нового объекта с использованием ключевого слова ‘new’.
  • Инициализация
    Вызов конструкторов, который идёт после ключевого слова ‘new’.

Приведём простой пример:

Класс Person.java


package net.proselyte.javacore.objects;

public class Person {
    private String name;

    /**
     * Default constructor
     */
    public Person() {
    }

    /**
     * Constructor that has parameter name
     */
    public Person(String name) {
        this.name = name;
    }

    public String toString() {
        return "\n========================\n" +
                "Person:\n" +
                "Name: " + name +
                "\n========================\n";
    }
}

Теперь создадим класс, который будет использовать наш класс Person.

Класс PersonRunner.java


package net.proselyte.javacore.objects;

public class PersonRunner {
    public static void main(String[] args) {
        Person person = new Person("Ivan Ivanov");

        System.out.println(person);
    }
}

Если всё было сделано правильно, то в результате работы программы мы получим следующий результат:


/*Some system messages*/
========================
Person:
Name: Ivan Ivanov
========================


Доступ к методам и переменным класса

Мы можем получить доступ к переменным и методам класса через его объект. Для этого нам необходимо создать методы получения и присваивания. Чаще всего их называют “геттеры” и “сеттеры”.

Приведём простой пример:

Класс Car.java


package net.proselyte.javacore.objects;

public class Car {
    String type;

    public Car() {
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "\n===============\n" +
                "Car:" +
                "\nType:" + type +
                "\n===============\n";
    }
}

Класс CarRunner.java


package net.proselyte.javacore.objects;

public class CarRunner {
    public static void main(String[] args) {
        Car bmw = new Car();

        bmw.setType("BMW");
        System.out.println("Car type (using getter): " + bmw.getType());
        System.out.println("Car Info (using toString() method): " + bmw);
    }
}

Если всё было сделано правильно, то в результате работы программы мы получим следующий результат:


/*Some system messages*/
Car type (using getter): BMW
Car Info (using toString() method): 
===============
Car:
Type:BMW
===============


Пакеты

В языке Java пакеты – это простой способ хранения классов и интерфейсов по категориям. Другими словами, это папки, в которых хранятся классы и интерфейсы одного модуля.

Например, в папке developer хранятся классы и интерфейсы, которые отвечают за такую сущность как разработчик.

Пример пакета:


package net.proselyte.javacore.objects;

Импорт сущностей

Каждый объект в Java имеет своё полное имя, которое включает в себя каталог.  Этот объект хранится и имя этого объекта. Например:


import net.proselyte.javacore.objects.Car;

В качестве резюме всего сказанного выше приведём пример простого приложения:

Исходный код проекта можно скачать по ЭТОЙ ССЫЛКЕ.

Например, у нас есть класс Developer, который описывает разработчика. Он имеет характеристики (поля) и поведение.

Характеристики:

  • идентификатор (id);
  • имя
  • фамилию
  • специализацию
  • опыт работы
  • зарплату

Поведение:

  • пишет код
  • впадать в депрессию
  • решать проблемы
  • наслаждаться жизнью

Если мы захотим описать такого разработчика используя язык Java, то получим следующий класс:

Developer.java


package net.proselyte.javacore.objects.developer;

public class Developer {
    /**
     * This is attributes of developer
     */
    private int id;
    private String firstName;
    private String lastName;
    private String specialty;
    private int experience;
    private int salary;


    /**
     * This is constructor - we will talk about it later
     */
    public Developer(int id, String firstName, String lastName, String specialty, int experience, int salary) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.specialty = specialty;
        this.experience = experience;
        this.salary = salary;
    }

    /**
     * Getters and Setters - designed to get or set values of developer's attributes
     */
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getSpecialty() {
        return specialty;
    }

    public void setSpecialty(String specialty) {
        this.specialty = specialty;
    }

    public int getExperience() {
        return experience;
    }

    public void setExperience(int experience) {
        this.experience = experience;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    /**
     * Behaviour of the developer
     */

    public void writeCode() {
        System.out.println("Developer is writing code...");
    }

    public void getDepressed() {
        System.out.println("Developer is depressed due to difficult bag in his program.");
    }

    public void solveProblem() {
        System.out.println("Developer is solving problem...");
        System.out.println("Problem solved.");
    }

    public void enjoyTheLife() {
        System.out.println("Finally, developer solved the problem and now he is rejoicing...");
    }

    @Override
    public String toString() {
        return "===================\n" +
                "Developer" +
                "\nid: " + id +
                "\nFirst Name='" + firstName +
                "\nLast Name: " + lastName +
                "\nSpecialty: " + specialty +
                "\nExperience: " + experience +
                "\nSalary: " + salary + "\n" +
                "===================\n";
    }
}

Для того чтобы посмотреть, как это работают методы нашего класса, создадим ещё один класс
DeveloperRunner.java


package net.proselyte.javacore.objects.developer;

public class DeveloperRunner {
    public static void main(String[] args) {
        Developer developer = new Developer(1, "Proselyte", "Developer", "Java", 3, 3000);

        System.out.println("Developer's Info:");
        System.out.println(developer);

        developer.writeCode();
        developer.getDepressed();
        developer.solveProblem();
        developer.writeCode();
        developer.enjoyTheLife();

        System.out.println("That's all...");
    }
}

Если всё было сделано верно, то в результате работы программы мы получим следующий результат:


/*Some system messages*/
Developer's Info:
===================
Developer
id: 1
First Name='Proselyte
Last Name: Developer
Specialty: Java
Experience: 3
Salary: 3000
===================

Developer is writing code...
Developer is depressed due to difficult bag in his program.
Developer is solving problem...
Problem solved.
Developer is writing code...
Finally, developer solved the problem and now he is rejoicing...
That's all...

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

В следующем уроке мы рассмотрим базовые типы данных в языке Java и их характеристики.