Что такое класс в java
Перейти к содержимому

Что такое класс в java

  • автор:

Как работать с классами в java

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

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

Пример создания класса:

public class Person  // свойства класса private String name; private int age; // конструктор класса public Person(String name, int age)  this.name = name; this.age = age; > // методы класса public String getName()  return name; > public void setName(String name)  this.name = name; > public int getAge()  return age; > public void setAge(int age)  this.age = age; > > 

В данном примере создается класс Person , который содержит свойства name и age , конструктор и методы getName() , setName() , getAge() и setAge() . Конструктор используется для инициализации свойств при создании объекта. Методы getName() и getAge() используются для получения значений свойств объекта, а методы setName() и setAge() — для их установки.

Для создания объекта на основе класса используется оператор new :

Person person = new Person("John", 30); 

В данном примере создается объект класса Person с именем person и свойствами name = «John» и age = 30 . Для доступа к свойствам объекта используются методы getName() и getAge() :

System.out.println(person.getName()); // => John System.out.println(person.getAge()); // => 30 

Также можно использовать методы setName() и setAge() для установки новых значений свойств объекта:

person.setName("Peter"); person.setAge(25); System.out.println(person.getName()); // => Peter System.out.println(person.getAge()); // => 25 

Класс в Java

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

Animal animal = new Animal();

Здесь создается объект animal класса Animal с помощью оператора new.

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

Декларация класса

В простейшем случае класс Animal декларируется так:

public class Animal < // . >

Двойным слэшем обозначается комментарий. Между фигурными скобками находится тело класса — поля и методы.

Обычно класс декларируется в отдельном файле, и имя файла совпадает с именем класса и имеет расширение java. Например, класс Animal хранится в файле Animal.java.

Скомпилируется и несколько классов в файле, но не любых — два публичных класса (с модификатором public) не могут находиться в одном файле. Также имя публичного класса обязано совпадать с именем файла.

Модификаторы доступа рассмотрим позднее, но в данном случае public означает, что к классу Animal доступ возможен из любого места программы, в том числе из другого пакета.

Бывают еще внутренние классы — класс внутри класса — их рассмотрим позднее.

Также класс может наследоваться от другого класса или реализовывать интерфейс.

Тело класса

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

package ru.sysout.oklassah; public class Animal < // поле private int size; // конструктор public Animal() < >// конструктор public Animal(int size) < this.size = size; >// метод public int getSize() < return size; >>

В вышеприведенном классе Animal есть поле size, метод getSize() и два конструктора Animal() и Animal (int size).

Конструктор

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

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

Animal animal = new Animal();

или с аргументом:

Animal animal = new Animal(5);

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

Наследование

Создадим класс Cat, который наследуется от Animal:

public class Cat extends Animal < // . >

Смысл наследования в том, чтобы заново не создавать повторяющиеся поля и методы. Ясно, что кошка — это животное, у нее могут быть такие присущие всем животным свойства, как вес, размер. Допустим, у нас будет еще рыба, и она тоже имеет размер и вес. Чтобы не создавать эти свойства в каждом классе, мы их положим в Animal, а в CatFish) будем создавать только специфические для CatFish) свойства.

Animal считается суперклассом Cat. Вообще в Java у любого класса уже есть суперкласс, даже если он явно не прописывается, как для Animal. Это суперкласс Object, Animal под капотом наследуется от Object. Компилятор не требует прописывать это наследование в коде, но тем не менее любой объект уже обладает некоторыми свойствами и методами Object (носящими технический характер — например, методом для сравнения объектов), но об этом поговорим позднее.

Реализация интерфейса

Интерфейс — набор абстрактных методов. Реализуются эти методы в классах. (В Java 8 появились default-методы, которые реализуются прямо в интерфейсах, но обычно они не нужны).

Интерфейс — это контракт, который реализуется каждым классом по-своему. Рассмотрим пример. Создадим интерфейс Movable:

public interface Movable

В нем задекларирован метод move(), но не реализован. Предполагается, что любой класс, реализующий интерфейс Movable, по-своему реализует этот метод. Вот так его реализует Cat:

public class Cat extends Animal implements Movable < @Override public void move() < System.out.println("cat is running"); >>

А вот так его реализует Fish:

public class Fish extends Animal implements Movable < @Override public void move() < System.out.println("fish is swimming"); >>

Как показано выше, implements Movable означает, что класс реализует интерфейс Movable, то есть реализует все абстрактные методы, прописанные в интерфейсе.

Если класс реализует несколько интерфейсов, то они пречисляются через запятую.

Абстрактный класс

Есть еще один вариант задекларировать абстрактный метод move() — можно сделать это не в интерфейсе Movable, а в абстрактном классе — точнее, суперклассе Animal:

public abstract class Animal

Здесь мы помечаем метод move() ключевым словом abstract и не реализуем его. Также мы помечаем словом abstract сам класс Animal — любой класс, который содержит хотя бы один абстрактный метод, должен быть абстрактным.

Итоги

  • Декларация класса выглядит так:

[ модификатор_доступа ] class ClassName [ extends SuperClassName ] [ implements InterfaceNames ]

В квадратных скобках выше перечислены необязательные элементы декларации.

  • Публичный класс должен находиться в файле с таким же именем.
  • Класс можно унаследовать от одного другого класса.
  • Любой класс, который мы сами не наследуем от другого класса, является наследником Object.
  • Класс может реализовывать несколько интерфейсов.
  • Если класс содержит хотя бы один абстрактный метод, то он должен быть абстрактным.

Упражнения

задача 1

Ниже показано содержимое файла Car.java, почему файл не компилируется — найдите ошибку:

class Car < >public class Toyota extends Car

Задача 2

Скомпилируется ли такой файл Car.java?

class Nexia < >class Mazda

Задача 3

Скомпилируется ли Animal.java, если Movable и Eatable — корректно определенные в отдельных файлах интерфейсы:

class Animal implements Eatable, Movable

Задача 4

Скомпилируется ли Cat.java, если Animal и Feline — публичные, корректно определенные в отдельных файлах классы:

public class Cat extends Animal, Feline

Задача 5

Найдите ошибку компиляции:

class Animal < abstract public void move(); public void eat() <>; >

О модификаторах доступа public, private, protected читайте далее.
Автор sysout Опубликовано 02.10.2018 31.12.2020 Рубрики Core Java

Добавить комментарий Отменить ответ

Прошу прощения: на комментарии временно не отвечаю.

Отношения в классах Java

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

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

Класс и объект – понятия

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

Ни одна программа немыслима без классов, а также objects. Class в Java – это своеобразный шаблон, который помогает создавать объекты. Объект выступает в виде экземпляра класса. Такие определения выдает Google.

Также стоит отметить, что:

  1. В Java class помогает определять структуру и поведение, совместно использующиеся относительно набора objects.
  2. В классе, согласно Google, содержатся переменные и методы. Это – элементы или члены.
  3. Class – база инкапсуляции в Джаве.
  4. У каждого объекта, заданного class, есть структура и поведение, определенные классом заранее.

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

Создание

Вот так, согласно Google, можно создать класс в Java:

Отношения в классах Java

После ключевого слова class принято прописывать его имя. Далее в кавычках указываются переменные и методы. Их конкретное количество не определено.

А вот еще один пример – описание public class для объекта Box. Example предусматривает три ключевые характеристики: ширину, высоту, глубину. Они описаны через переменные:

Отношения в классах Java

В случае с objects требуется воспользоваться таким оператором:

Отношения в классах Java

Google указывает на то, что при создании соответствующего элемента процедура проходит в несколько этапов:

  1. Сначала осуществляется объявление переменной типа класса. Она не будет определять object. Google указывает, что это необходимо для установки переменной, которая умеет ссылаться на объект.
  2. Далее происходит непосредственное создание ранее упомянутого компонента кода. Через оператор new динамически будет зарезервирована память для object, после чего произведется возврат ссылки на него.

После объявления объекта класса Box все переменные класса, по Google, получат значение по умолчанию для заданного типа информации. Для обращения к переменным и дальнейшей работы с ними применяется имя переменной object:

Отношения в классах Java

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

Ассоциации

Ассоциация – когда объекты двух классов ссылаются друг на друга. Они имеют между собой своеобразную связь. Пример – работник может выписать счет. Это влечет за собой ассоциацию между «участниками процесса». Еще один наглядный пример – преподаватели и студенты. Какой-то студент будет учиться у определенного преподавателя.

Ассоциация по Google – это описание связи между двумя определенными objects. Концепция здесь простая: есть объекты, которые могут быть связаны между собой. И эти связи требуется как-то описывать.

Aggregation и composition

Агрегация и композиция, если верить Google – это частный случай ассоциации. Представлены конкретизированными отношениями между objects в имеющемся исходном коде.

Тут стоит запомнить следующее:

  1. Агрегация – отношение, когда один объект выступает в качестве части другого. Пример – ученик входит в группу любителей химии.
  2. Композиция – более жесткий вариант. Object здесь не только относится к другому “похожему компоненту», но и не может иметь отношение к другим. Пример – машина и двигатель. Второй элемент способен выступать без автомобиля, но он не сможет находиться одновременно в нескольких транспортных средствах. А студенты способны посещать различные группы по интересам одновременно.

Все это – условное описание, которое дает Google. Но за счет него даже новичок сможет достаточно быстро разобраться, с чем ему предстоит иметь дело.

Примеры кодов

Чтобы позиции относительно рассматриваемого направления были быстро поняты, лучше рассмотреть наглядные примеры. Их очень много в Google. Почти все они выступают в качестве тривиальных.

Примеры основываются на следующих принципах:

  1. В пределах одного класса создается ссылка на другой и наоборот. Второй вариант встречается не всегда.
  2. Осуществляется развитие заданной идеи в зависимости от имеющихся связей. У машины 4 колеса, она будет со всеми связана. Это значит, что авто имеет ссылку на список колес (или так называемый массив).
  3. В примере нужно соединить робота с оператором его управления. Для этого используется не агрегирование, а ассоциации через ссылки в одном классе на другой.
  4. Robot будет иметь ссылку на класс Operator. Обратный вариант тоже присутствует.

Так описывается Robot:

Отношения в классах Java

А вот – Operator:

Отношения в классах Java

Допустимо создавать ссылки только в одном классе. Тогда связи односторонние. А можно ссылаться на массив или список, но ключевая концепция не меняется.

Наследование

Еще один вариант отношений – это ключевая концепция ООП. Речь идет о наследовании. Оно представляет собой своеобразный механизм при помощи которого удается описывать новые классы на основе уже существующего (родителя). Свойства и функциональность родительского класса, по Google, будут заимствованы «наследником».

Здесь стоит запомнить следующие данные:

  1. Если у дочернего класса есть уникальные свойства, поля спокойно объявляются внутри него.
  2. Главное преимущество наследование – возможность повторного использования программного кода.
  3. Множественное наследование в Джаве отсутствует. Класс наследуется только от одного «родителя».

В Google можно обнаружить немало туториалов и примеров, которые лучше всего объясняют соответствующую особенность.

Особое взаимодействие

Стоит обратить внимание на еще один метод взаимодействия компонентов кода. Речь идет о ситуации, когда постоянная связь между objects отсутствует, но какие-то сведения требуется передать от одного к другому.

Для этого применяется передача object непосредственно в методе. Пример – робот имеет method, который принимает информацию от другой «машины»: координаты. Это требуется для перемещения первого.

Ситуация потребует создания метода, который в виде параметра обладает object класса Robot. Чтобы лучше понимать композицию и агрегацию, а также иные особенности программирования на Java, стоит посетить дистанционные компьютерные курсы. Они помогут без Google быстро освоить выбранное направление и набраться практического опыта.

Классы

Базовым элементом объектно-ориентированного программирования в языке Java является класс. В этой главе Вы научитесь создавать и расширять свои собственные классы, работать с экземплярами этих классов и начнете использовать мощь объектно-ориентированного подхода. Напомним, что классы в Java не обязательно должны содержать метод main. Единственное назначение этого метода — указать интерпретатору Java, откуда надо начинать выполнение программы. Для того, чтобы создать класс, достаточно иметь исходный файл, в котором будет присутствовать ключевое слово class, и вслед за ним — допустимый идентификатор и пара фигурных скобок для его тела.

class Point

Замечание

Имя исходного файла Java должно соответствовать имени хранящегося в нем класса. Регистр букв важен и в имени класса, и в имени файла.

Как вы помните из главы 2, класс — это шаблон для создания объекта. Класс определяет структуру объекта и его методы, образующие функциональный интерфейс. В процессе выполнения Java-программы система использует определения классов для создания представителей классов. Представители являются реальными объектами. Термины , и взаимозаменяемы. Ниже приведена общая форма определения класса.

class имя_класса extends имя_суперкласса < type переменная1_объекта: type переменная2_объекта: type переменнаяN_объекта: type имяметода1(список_параметров) < тело метода; >type имяметода2(список_параметров) < тело метода; >type имя методаМ(список_параметров) < тело метода; >>

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

Переменные представителей (instance variables)

Данные инкапсулируются в класс путем объявления переменных между открывающей и закрывающей фигурными скобками, выделяющими в определении класса его тело. Эти переменные объявляются точно так же, как объявлялись локальные переменные в предыдущих примерах. Единственное отличие состоит в том, что их надо объявлять вне методов, в том числе вне метода main. Ниже приведен фрагмент кода, в котором объявлен класс Point с двумя переменными типа int.

class Point

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

Оператор new

Оператор new создает экземпляр указанного класса и возвращает ссылку на вновь созданный объект. Ниже приведен пример создания и присваивание переменной р экземпляра класса Point.

Point р = new Point();

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

class TwoPoints < public static void main(String args[]) < Point p1 = new Point(); Point p2 = new Point(); p1.x = 10; p1.y = 20; р2.х = 42; р2.у = 99; System.out.println("x = " + p1.x + " у = " + p1.y); System.out.println("x = " + р2.х + " у x = " + р.х + " у x = " + p1.x + " у = " + p-l.y); System.out.printlnC'x = " + p2.x + " у x = " + p.x + " у x = " + p.x + " у p1 = " + pi.x + ", " + p1.y); System.out.println("p2 = " + p2.x + ", " + p2.y); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(60, 80) x = " + p.x + " y = " + p.y + " z p1="+p1.x+","+p1.y+","+p1.z); System.out.println("p2="+p2.x+","+p2.y+","+p2.z); System.out.println("p="+p.x+","+p.y); System.out.println("p1.distance(p2)="+p1.distance(p2)); System.out.println("p1.distance(4,6)="+p1.distance(4,6)); System.out.println("p1.distance(p) Inside A's callrne method"); >> class В extends A < void callme() < System.out.println("Inside B's callme method"); >> class Dispatch < public static void main(String args[]) < A a = new B(); a.callme(); >>

Обратите внимание — внутри метода main мы объявили переменную а класса А, а проинициализировали ее ссылкой на объект класса В. В следующей строке мы вызвали метод callme. При этом транслятор проверил наличие метода callme у класса А, а исполняющая система, увидев, что на самом деле в переменной хранится представитель класса В, вызвала не метод класса А, а callme класса В. Ниже приведен результат работы этой программы:

С:\> Java Dispatch Inside B's calime method

Совет

Программистам Delphi / C++ следует отметить, что все Java по умолчанию являются виртуальными функциями (ключевое слово virtual).

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

final

Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие-либо переменные и методы вашего класса, вам нужно объявить их как final (в Delphi / C++ не писать слово virtual).

final int FILE_NEW = 1;

По общепринятому соглашению при выборе имен переменных типа final — используются только символы верхнего регистра (т.е. используются как аналог препроцерных констант C++). Использование final-методов порой приводит к выигрышу в скорости выполнения кода — поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода).

finalize

В Java существует возможность объявлять методы с именем finalize. Методы finalize аналогичны деструкторам в C++ (ключевой знак ~) и Delphi (ключевое слово destructor). Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса.

static

Иногда требуется создать метод, который можно было бы использовать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода — указать при его объявлении модификатор типа static. Статические методы могут непосредственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this и super. Переменные также могут иметь тип static, они подобны глобальным переменным, то есть доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.

class Static < static int a = 3; static int b; static void method(int x) < System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); >static < System.out.println("static block initialized"); b = a * 4; >public static void main(String args[]) < method(42); >>

Ниже приведен результат запуска этой программы.

С:\> java Static static block initialized Х = 42 А = 3 B = 12

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

class StaticClass < static int a = 42; static int b = 99; static void callme() < System.out.println("a = " + a); >> class StaticByName < public static void main(String args[]) < StaticClass.callme(); System.out.println("b Inside A's metoo method"); >> class B extends A < void callme() < System.out.println("Inside B's callme method"); >> class Abstract < public static void main(String args[]) < A a = new B(): a.callme(): a.metoo(): >>

В нашем примере для вызова реализованного в под-классе класса А метода callme и реализованного в классе А метода metoo используется динамическое назначение методов, которое мы обсуждали раньше.

С:\> Java Abstract Inside B's callrne method Inside A's metoo method

Классическое заключение

В этой главе вы научились создавать классы, конструкторы и методы. Вы осознали разницу между совмещением (overloading) и замещением (overriding) методов. Специальные переменные this и super помогут вам сослаться на текущий объект и на его суперкласс. В ходе эволюции языка Java стало ясно, что в язык нужно ввести еще несколько организационных механизмов — возможности более динамичного назначения методов и возможности более тонкого управления пространством имен класса и уровнями доступа к переменным и методам объектов. Оба этих механизма — интерфейсы и пакеты, описаны в следующей главе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *