5. Java - Классы и объекты



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

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

В этой главе мы рассмотрим объекты и классы в Java, их концепции.

Класс может быть определен как шаблон (обозначен зеленым цветом), который описывает поведение объекта, который в свою очередь имеет состояние и поведение. Он является экземпляром класса. Например: собака может иметь состояние - цвет, имя, а также и поведение - кивать, лаить, есть.

Объекты в Java

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

Если учесть, собаку, то ее состояние - имя, порода, цвет, а образ жизни - лай, виляние хвостом, бег.

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

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

Классы в Java

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

Пример создания класса в Java, приводится ниже:

public class Dog{
   String breed;
   int age;
   String color;

   void barking(){
   }
   
   void hungry(){
   }
   
   void sleeping(){
   }
}

Класс может содержать любой из следующих видов переменных:

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

В Java классы могут иметь любое количество методов для доступа к значению различных видов методов. В приведенном выше примере, barking(), hungry() и sleeping() являются методами.

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

Конструктор класса

При обсуждении вопроса класса, одной из наиболее важных подтем в Java является конструктор. Каждый класс имеет конструктор. Если мы не напишем его или, например, забудем, компилятор создаст его по умолчанию для этого класса.

Каждый раз, когда в Java создается новый объект, будет вызываться по меньшей мере один конструктор. Главное правило является то, что они должны иметь то же имя, что и класс, который может иметь более одного конструктора.

Пример конструктора приведен ниже:

public class Puppy{
   public Puppy(){
   }

   public Puppy(String name){
      // Так выглядит конструктор в Java и у него один параметр, name.
   }
}
Примечание: в следующих разделах мы будем более подробно обсуждать, если у нас будет два разных типа конструкторов.

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

Варианты как создать объект в классе следующие:

  • Объявление: объявление переменной с именем переменной с типом объекта.
  • Инстанцирование: используется «новое» ключевое слово.
  • Инициализация: «новое» ключевое слово сопровождается вызовом конструктора. Этот вызов инициализирует новый объект.

Пример приводится ниже:

public class Puppy{

   public Puppy(String name){
      // Это конструктор и у него один параметр, name.
      System.out.println("Передаваемое имя:" + name ); 
   }
   public static void main(String []args){
      // Создание объекта myPuppy.
      Puppy myPuppy = new Puppy( "Багет" );
   }
}

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

Передаваемое имя: Багет

Доступ к переменным экземпляра и методам в Java

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

/* Сначала создайте объект */ 
ObjectReference = new Constructor();

/* Теперь вызовите переменную следующим образом */ 
ObjectReference.variableName;

/* Теперь Вы можете вызвать метод класса */
ObjectReference.MethodName();

Пример

Этот пример объясняет, как получить доступ к переменные экземпляра и методам класса в Java:

public class Puppy{
   
   int puppyAge;

   public Puppy(String name){
      // Это конструктор и у него один параметр, name.
      System.out.println("Передаваемое имя:" + name ); 
   }
   public void setAge( int age ){
       puppyAge = age;
   }

   public int getAge( ){
       System.out.println("Возраст щенка:" + puppyAge ); 
       return puppyAge;
   }
   public static void main(String []args){
      /* Создание объекта. */
      Puppy myPuppy = new Puppy( "Багет" );

      /* Вызов метод класса, чтобы установить возраст щенка. */ 
      myPuppy.setAge( 2 );

      /* Вызов другого метода класса, чтобы получить возраст щенка. */
      myPuppy.getAge( );

      /* Получение переменной экземпляра класса. */
      System.out.println("Значение переменной:" + myPuppy.puppyAge ); 
   }
}

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

Передаваемое имя: Багет
Возраст щенка: 2
Значение переменной: 2

Правила объявления классов, операторов импорта и пакетов в исходном файле

В последней части этого раздела давайте рассмотрим правила декларации исходного файла. Эти правила в Java имеют важное значение при объявлении классов, операторов импорта и операторов пакета в исходном файле.

  • В исходном файле может быть только один публичный класс (public class).
  • Исходный файл может иметь несколько "непубличных" классов.
  • Название публичного класса должно совпадать с именем исходного файла, который должен иметь расширение .java в конце. Например: имя класса public class Employee{}, то исходный файл должен быть Employee.java.
  • Если класс определен внутри пакета, то оператор пакет должно быть первым оператором в исходном файле.
  • Если присутствуют операторы импорта, то они должны быть написаны между операторами пакета и объявлением класса. Если нет никаких операторов пакета, то оператор импорта должен быть первой строкой в исходном файле.
  • Операторы импорта и пакета будут одинаково выполняться для всех классов, присутствующих в исходном файле. В Java не представляется возможным объявить различные операторы импорта и/или пакета к различным классам в исходном файле.

Классы имеют несколько уровней доступа и существуют различные типы классов: абстрактные классы (abstract class), конечные классы (final class) и т.д. Обо всем этом обсудим в разделе модификаторы доступа.

Помимо указанных выше типов классов, Java также имеет некоторые специальные классы, называемые внутренние (Inner class) и анонимные классы (Anonymous class).

Java пакет (package)

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

Операторы импорта (import)

Если задать полное имя, которое включает в себя пакет и имя класса, то компилятор может легко найти исходный код или классы. В Java импорт это способ задать правильное место для компилятора, чтобы найти конкретный класс.

Например, следующая строка будет просить компилятор загрузить все классы, доступные в каталоге «java_installation/java/io»:

import java.io.*;

Простой пример по выше описанному

Для нашего обучения создадим два класса. Это будут классы Employee и EmployeeTest.

Для начала откройте блокнот и добавьте следующий код. Помните, что этот класс Employee является открытым или публичным классом. Теперь сохраните исходный файл с именем Employee.java.

Класс Employee имеет четыре переменных экземпляра name, age, designation и salary. Он имеет один явно определенный конструктор, который принимает параметр.

import java.io.*;
public class Employee{
   String name;
   int age;
   String designation;
   double salary;
	
   // Это конструктор класса Employee. 
   public Employee(String name){
      this.name = name;
   }
   // Присвоение возраста работника переменной age.
   public void empAge(int empAge){
      age =  empAge;
   }
   /* Присвоение переменной designation. */
   public void empDesignation(String empDesig){
      designation = empDesig;
   }
   /* Присвоение переменной salary. */
   public void empSalary(double empSalary){
      salary = empSalary;
   }
   /* Вывод подробной информации. */
   public void printEmployee(){
      System.out.println("Имя:"+ name );
      System.out.println("Возраст:" + age );
      System.out.println("Наименование:" + designation );
      System.out.println("Заработная плата:" + salary);
   }
}

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

Ниже приводится класс EmployeeTest, в котором создаются два экземпляра класса Employee и вызывают методы для каждого объекта, для присвоения значений каждой переменной.

Сохраните следующий код в файл «EmployeeTest.java»:

import java.io.*;
public class EmployeeTest{

   public static void main(String args[]){
      /* Создание двух объектов с помощью конструктора. */
      Employee empOne = new Employee("Олег Олегов");
      Employee empTwo = new Employee("Иван Иванов");

      // Вызов метода для каждого созданного объекта.
      empOne.empAge(26);
      empOne.empDesignation("Старший инженер-программист");
      empOne.empSalary(1000);
      empOne.printEmployee();

      empTwo.empAge(21);
      empTwo.empDesignation("Инженер-программист");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

Теперь, скомпилировав оба класса, запустим EmployeeTest и получим следующий результат:

C:> javac Employee.java 
C:> vi EmployeeTest.java 
C:> javac EmployeeTest.java 
C:> java EmployeeTest 
Имя: Олег Олегов 
Возраст: 26 
Наименование: Старший инженер-программист 
Заработная плата: 1000.0 
Имя: Иван Иванов
Возраст: 21 
Наименование: Инженер-программист 
Заработная плата: 500.0

Что дальше?

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