Java - знакомство с классами (классы, создание объектов)

Ранее мы уже говорили "о классах вообще", но вернёмся к данной теме ещё раз теперь уже относительно Явы.

Объявления класса с методами и полями( = "переменными экземпляра") подчиняется следующей схеме:

class НекотороеИмяКласса {
    типПеременной   имяПеременной_экземпляра1;
    
    типПеременнойВозвращаемойМетодом имяМетода1(список параметров){
        // тело метода
    }

 //в списке параметро, если он не пуст также указываются типы переменных: 
// могут передаваться переменные разного типа  
   типПеременнойВозвращаемойМетодом имяМетода2( типПеременной  имяПермен1, типПеременной  имяПермен2){
        // тело метода
    }
}

Конкретный пример:

public class MyGoodClass { // указываем имя класса
  public char maxnumb; // поле с максимальным номером (получим его из массива)

// метод-конструктор
  public MyGoodClass(char[] numbarr){ // принимаем массив символов
    // здесь реализация конструктора (например пытаемся получить максимум из массива)
  }

// далее обычный метод: 
  public Method1(String str){ // получает и печатает строку с решёткой
    System.out.println(str + "#");
  }

}

Только методы или только поля или и то и то =)

В примерах выше наги классы содержали и методы и поля - но это не обязательно ,например могут быть только поля:

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

public class Car { // класс "машина"
  public int height; // высота
  public int width; // ширина
}

Программа - это класс

Классы особенно важны в Яве, так как даже минимальная программа (например такая) - уже представляет из себя класс, рассмотрим её здесь, но прокомментируем в другом отношении (сократив то, что нам не важно в данный момент):

// список пакетов, которые содержат описания 
// необходимых нам классов
import java.util.Date;   // для работы с датой
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
 public class Test {
        // String[] args  - возможные переменные командной строки
		//   public static void main - метод ,который является "точкой входа" в программу
		public static void main(String[] args) throws ParseException {
             
			// создаём переменную типа класс DateFormat 
            DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
			
			// класс типа Date инициализируется с помощью
			// вызова метода класса  formatter 
            Date date =  formatter.parse("20140427"); // 27 апреля 2014 года (воскресение)
 
            // инициаллизация класса календаря
			Calendar calendar = Calendar.getInstance();
            calendar.setTime(date); // настраиваем календарь передав дату
  
            // узнаем является ли "переданный" день выходным:
			// для этого выполняем сравнение полей классов
            if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){ // сравнение
               System.out.println("Воскресение: Отдыхайте, завтра рабочий день...");             
            } else { 
				System.out.println("сегодня день рабочий!)))");
			}
   }
 }

Пример выше содержит (помимо нашего собственного класса-программы Test) создание и обращение к методам и полям класса определённых библиотекой Java (разработчик может использовать их "сразу" - спасибо создателям Java )) - так, например, мы использовали объекты (= экземпляры классов) типа типа DateFormat и Date.

Создание объекта (инстацирование класса)

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

Итак давайте посмотрим как на основе предварительного описания этот самый объект создаётся.
Выше мы привоидли пример класса Car (автомобиль). Давай те теперь создадим уже объект данного класса:

Car mycar = new Car(); // создание объекта класса "Автомобиль"

Строкой выше мы не только объявили
переменную типа "Автомобиль" ,но
и создали объект данного типа - это можно переписать
в виде:

     Car mycar; // объявление переменной типа "Автомобиль"
// после выполнения предыдущей строки переменная mycar
// содержит значение null - это указаывает на то что она пока 
// не хранит ссылку на объект
     mycar = new Car(); // создание объекта класса "Автомобиль"
// теперь переменная mycar хранит ссылку на объект, который 
// мы создали 

Если использовать переменную mycar сразу после объявления (Car mycar;) - то есть до получения ссылки на объект - то мы получим ошибку времени компиляции (программа не скомпилируется).

Оператор NEW

Оператор new служит для создания объектов данного класса (= данного типа), его "внешний вид" в расках синтаксиса Явы подчиняется схеме:

имя_переменной = new имя_класса();

скобки после имени класса идёт потому, что подразумевается вызов функции-конструктора данного класса.

Оператор new резервирует память для объекта на всё время выполнения.

Присваивание объектных переменных

Объектные переменные - это ссылки (то есть фактически они хранят лишь адреса памяти, по котрым располагается объект), а потому присваивание типа:

Car a1 = new Car();
Car a2 = a1;
// две переменные теперь ссылаются на один и тот же объект

приведёт к тому, что две переменные будут ссылаться на один и тот же объект. созданный в первой строке (Car a1 = new Car())

То есть можно сказать ,что копирования объекта при подобном присваивании не происходит, а происходит копирование ссылки.

Движемся дальше

Теперь движемся дальше по нашей программе, поговорим подробнее о методах класса

Key Words for FKN + antitotal forum (CS VSU):