В Groovy, как и в любом другом объектно-ориентированном языке, существует концепция классов и объектов для представления объектно-ориентированной природы языка программирования. Класс Groovy — это набор данных и методов, которые работают с этими данными. Вместе данные и методы класса используются для представления некоторого объекта реального мира из проблемной области.
Класс в Groovy объявляет состояние (данные) и поведение объектов, определенных этим классом. Следовательно, класс Groovy описывает как поля экземпляра, так и методы для этого класса.
Ниже приведен пример класса в Groovy. Имя класса: Student, у которого есть два поля — StudentID и StudentName . В основной функции мы создаем объект этого класса и присваиваем значения для StudentID и StudentName объекта.
class Student { int StudentID; String StudentName; static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName = "Joe" } }
Методы получения и установки
На любом языке программирования всегда практикуется скрытие членов экземпляра с помощью ключевого слова private и предоставление методов получения и установки для установки и получения значений переменных экземпляра соответственно. В следующем примере показано, как это можно сделать.
class Student { private int StudentID; private String StudentName; void setStudentID(int pID) { StudentID = pID; } void setStudentName(String pName) { StudentName = pName; } int getStudentID() { return this.StudentID; } String getStudentName() { return this.StudentName; } static void main(String[] args) { Student st = new Student(); st.setStudentID(1); st.setStudentName("Joe"); println(st.getStudentID()); println(st.getStudentName()); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
1 Joe
Обратите внимание на следующие ключевые моменты о вышеуказанной программе —
-
В классе studentID и studentName помечаются как закрытые, что означает, что к ним нельзя получить доступ извне класса.
-
Каждый элемент экземпляра имеет свой собственный метод получения и установки. Метод getter возвращает значение переменной экземпляра, например, метод int getStudentID (), а метод setter устанавливает значение идентификатора экземпляра, например, метод void setStudentName (String pName)
В классе studentID и studentName помечаются как закрытые, что означает, что к ним нельзя получить доступ извне класса.
Каждый элемент экземпляра имеет свой собственный метод получения и установки. Метод getter возвращает значение переменной экземпляра, например, метод int getStudentID (), а метод setter устанавливает значение идентификатора экземпляра, например, метод void setStudentName (String pName)
Методы экземпляра
Обычно естественно включать в класс больше методов, которые фактически выполняют какую-то функциональность для класса. В нашем примере со студентом давайте добавим членов экземпляров Marks1, Marks2 и Marks3, чтобы обозначить оценки ученика по 3 предметам. Затем мы добавим новый метод экземпляра, который будет вычислять итоговые оценки ученика. Вот как будет выглядеть код.
В следующем примере метод Total является дополнительным методом Instance, в который встроена некоторая логика.
class Student { int StudentID; String StudentName; int Marks1; int Marks2; int Marks3; int Total() { return Marks1+Marks2+Marks3; } static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName="Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 30; println(st.Total()); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
60
Создание нескольких объектов
Можно также создать несколько объектов класса. Ниже приведен пример того, как этого можно достичь. Здесь мы создаем 3 объекта (st, st1 и st2) и вызываем их члены экземпляра и методы экземпляра соответственно.
class Student { int StudentID; String StudentName; int Marks1; int Marks2; int Marks3; int Total() { return Marks1+Marks2+Marks3; } static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 30; println(st.Total()); Student st1 = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 40; println(st.Total()); Student st3 = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 50; println(st.Total()); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
60 70 80
наследование
Наследование может быть определено как процесс, в котором один класс приобретает свойства (методы и поля) другого. С использованием наследования информация становится управляемой в иерархическом порядке.
Класс, который наследует свойства other, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, называется суперклассом (базовый класс, родительский класс).
Расширяет
extends — это ключевое слово, используемое для наследования свойств класса. Ниже приведен синтаксис ключевого слова extends. В следующем примере мы делаем следующие вещи —
-
Создание класса с именем Person. Этот класс имеет одного члена экземпляра с именем name.
-
Создание класса с именем Student, который выходит из класса Person. Обратите внимание, что член экземпляра имени, определенный в классе Person, наследуется в классе Student.
-
В конструкторе класса Student мы вызываем конструктор базового класса.
-
В нашем классе Student мы добавляем 2 дополнительных члена-экземпляра StudentID и Marks1.
Создание класса с именем Person. Этот класс имеет одного члена экземпляра с именем name.
Создание класса с именем Student, который выходит из класса Person. Обратите внимание, что член экземпляра имени, определенный в классе Person, наследуется в классе Student.
В конструкторе класса Student мы вызываем конструктор базового класса.
В нашем классе Student мы добавляем 2 дополнительных члена-экземпляра StudentID и Marks1.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; st.name = "Joe"; println(st.name); } } class Person { public String name; public Person() {} } class Student extends Person { int StudentID int Marks1; public Student() { super(); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Joe
Внутренние классы
Внутренние классы определены в других классах. Вмещающий класс может использовать внутренний класс как обычно. С другой стороны, внутренний класс может получить доступ к членам своего окружающего класса, даже если они являются закрытыми. Классы, отличные от включающего класса, не имеют доступа к внутренним классам.
Ниже приведен пример внешнего и внутреннего класса. В следующем примере мы делаем следующие вещи —
- Создание класса с именем Outer, который будет нашим внешним классом.
- Определение строки с именем name в нашем внешнем классе.
- Создание внутреннего или вложенного класса внутри нашего внешнего класса.
- Обратите внимание, что во внутреннем классе мы можем получить доступ к элементу экземпляра имени, определенному в классе Outer.
class Example { static void main(String[] args) { Outer outobj = new Outer(); outobj.name = "Joe"; outobj.callInnerMethod() } } class Outer { String name; def callInnerMethod() { new Inner().methodA() } class Inner { def methodA() { println(name); } } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Joe
Абстрактные классы
Абстрактные классы представляют собой общие понятия, поэтому их нельзя создавать, создавая для подкласса. Их члены включают поля / свойства и абстрактные или конкретные методы. Абстрактные методы не имеют реализации и должны быть реализованы конкретными подклассами. Абстрактные классы должны быть объявлены с ключевым словом abstract. Абстрактные методы также должны быть объявлены с ключевым словом abstract.
В следующем примере обратите внимание, что класс Person теперь превращен в абстрактный класс и не может быть создан. Также обратите внимание, что в абстрактном классе есть абстрактный метод DisplayMarks, в котором нет деталей реализации. В студенческом классе обязательно добавить детали реализации.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; st.name="Joe"; println(st.name); println(st.DisplayMarks()); } } abstract class Person { public String name; public Person() { } abstract void DisplayMarks(); } class Student extends Person { int StudentID int Marks1; public Student() { super(); } void DisplayMarks() { println(Marks1); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —
Joe 10 null
Интерфейсы
Интерфейс определяет контракт, которому должен соответствовать класс. Интерфейс только определяет список методов, которые должны быть реализованы, но не определяет реализацию методов. Интерфейс должен быть объявлен с использованием ключевого слова interface. Интерфейс определяет только сигнатуры методов. Методы интерфейса всегда общедоступны . Ошибочно использовать защищенные или приватные методы в интерфейсах.
Ниже приведен пример интерфейса в Groovy. В следующем примере мы делаем следующие вещи —
-
Создание интерфейса с именем Marks и создание метода интерфейса с именем DisplayMarks.
-
В определении класса мы используем ключевое слово Implements для реализации интерфейса.
-
Поскольку мы реализуем интерфейс, мы должны предоставить реализацию для метода DisplayMarks.
Создание интерфейса с именем Marks и создание метода интерфейса с именем DisplayMarks.
В определении класса мы используем ключевое слово Implements для реализации интерфейса.
Поскольку мы реализуем интерфейс, мы должны предоставить реализацию для метода DisplayMarks.
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; println(st.DisplayMarks()); } } interface Marks { void DisplayMarks(); } class Student implements Marks { int StudentID int Marks1; void DisplayMarks() { println(Marks1); } }
Когда мы запустим вышеуказанную программу, мы получим следующий результат —