GrabDuck

Классы и объекты | Java

:

Последнее обновление: 30.10.2015

Java является объектно-ориентированным языком, поэтому такие понятия как "класс" и "объект" играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.

Шаблоном или описанием объекта является класс, а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке - наличие двух рук, двух ног, головы, пищеварительной, нервной системы, головного мозга и т.д. Есть некоторый шаблон - этот шаблон можно назвать классом. Реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.

Класс определяется с помощью ключевого слова сlass:

class Book{

}

Вся функциональность класса представлена его членами - полями (полями называются переменные класса) и методами. Например, класс Book мог бы иметь следующее определение:

class Book{
	public String name;
    public String author;
    public int year;

    public void Info(){
        System.out.printf("Книга '%s' (автор %s) была издана в %d году \n", name, author, year);
    }	
}

Таким образом, в классе Book определены три переменных и один метод, который выводит значения этих переменных

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

class Book{

	public String name;
    public String author;
    public int year;
	
	Book(){ 
		name = "неизвестно";
        author = "неизвестно";
        year = 0;
	}

    Book(String name, String author, int year){
        
		this.name = name;
        this.author = author;
        this.year = year;
    }
	
    public void Info(){
        System.out.printf("Книга '%s' (автор %s) была издана в %d году \n", name, author, year);
    }	
}

Здесь у класса Book определено два конструктора. Первый конструктор без параметров присваивает неопределенные начальные значения полям. Второй конструктор присваивает полям класса значения, которые передаются через его параметры.

Так как имена параметров и имена полей класса в данном случае у нас совпадают - name, author, year, то мы используем ключевое слово this. Это ключевое слово представляет ссылку на текущий объект. Поэтому в выражении this.name = name; первая часть this.name означает, что name - это поле текущего класса, а не название параметра name. Если бы у нас параметры и поля назывались по-разному, то использовать слово this было бы необязательно.

Мы можем определить несколько конструкторов для установки разного количества параметров и затем вызывать один конструктор из другого:

public class Book{

    public String name;
    public String author;
    public int year;

    Book(String name, String author){ 
       
        this.name = name;
        this.author = author;
    }

    Book(String name, String author, int year){
        
        this(name, author);
        this.year = year;
    }
}

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

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

Чтобы непосредственно использовать класс в программе, надо создать его объект. Процесс создания объекта двухступенчатый: вначале объявляется переменная данного класса, а затем с помощью ключевого слова new и конструктора непосредственно создается объект, на который и будет указывать объявленная переменная:

Book b; // объявление переменной, которая еще не хранит ссылку на объект
b = new Book(); // выделение памяти под объект Book

После объявления переменной Book b; эта переменная еще не ссылается ни на какой объект и имеет значение null. Затем мы создаем непосредственно объект класса Book с помощью одного из конструкторов и ключевого слова new.

Инициализаторы

Кроме конструктора начальную инициализацию объекта вполне можно было проводить с помощью инициализатора объекта. Так, мы бы могли заменить конструктор без параметров следующим блоком:

public class Book{

    public String name;
    public String author;
    public int year;
	
	/*начало блока инициализатора*/
    {
        name = "неизвестно";
        author = "неизвестно";
        year = 0;
    }
	/*конец блока инициализатора*/
	
    Book(String name, String author, int year){
        
		this.name = name;
        this.author = author;
        this.year = year;
    }	
}

Программа с классами

Теперь используем класс в программе. Создадим в NetBeans новый проект. Назовем его, например, BookStore:

Классы в Java

Итак, по умолчанию у нас в проекте создается пакет bookstore. Добавим в него новый класс. Для этого нажмем на пакет bookstore правой кнопкой мыши и в появившемся контекстном меню выберем Новый-> Класс Java...

Затем в окне создания нового класса назовем его Book, а остальные опции оставим по умолчанию. После этого в пакет bookstore будет добавлен новый класс:

Добавление нового класса в Java

Изменим автосгенерированный код в файле Book.java на следующий:

package bookstore;

public class Book{

    public String name;
    public String author;
    public int year;
	
    Book(){ 
	
        name = "неизвестно";
        author = "неизвестно";
        year = 0;
    }

    Book(String name, String author, int year){
        
		this.name = name;
        this.author = author;
        this.year = year;
    }
	
    public void info(){
        System.out.printf("Книга '%s' (автор %s) была издана в %d году \n", name, author, year);
    }	
}

Теперь перейдем к коду файла BookStore.java и изменим его следующим образом:

package bookstore;

public class BookStore {

    public static void main(String[] args) {
        
        Book b1 = new Book("Война и мир", "Л. Н. Толстой", 1869);
        b1.info();

        Book b2 = new Book();
        b2.info();
    } 
}

Если мы запустим код на выполнение, то консоль выведет нам информацию о книгах b1 и b2:

Книга 'Война и мир' (автор Л. Н. Толстой) была издана в 1869 году 
Книга 'неизвестно' (автор неизвестно) была издана в 0 году