Groovy - объектно-ориентированный
В Groovy, как и в любом другом объектно-ориентированном языке, существует концепция классов и объектов, отражающая объектно-ориентированную природу языка программирования. Класс Groovy - это набор данных и методы, которые работают с этими данными. Вместе данные и методы класса используются для представления некоторого объекта реального мира из проблемной области.
Класс в Groovy объявляет состояние (данные) и поведение объектов, определенных этим классом. Следовательно, класс Groovy описывает как поля экземпляра, так и методы этого класса.
Ниже приведен пример класса в Groovy. Имя класса - Студент, у которого есть два поля -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 помечены как частные, что означает, что к ним нельзя получить доступ извне класса.
Каждый член экземпляра имеет свой собственный метод получения и установки. Метод получения возвращает значение переменной экземпляра, например метод int getStudentID (), а метод установки устанавливает значение идентификатора экземпляра, например метод - void setStudentName (String pName)
Методы экземпляра
Обычно естественно включать в класс больше методов, которые фактически выполняют некоторые функции для класса. В нашем примере со студентом давайте добавим члены экземпляра Marks1, Marks2 и Marks3, чтобы обозначить оценки учащегося по 3 предметам. Затем мы добавим новый метод экземпляра, который будет подсчитывать общие оценки ученика. Вот как будет выглядеть код.
В следующем примере метод Total является дополнительным методом экземпляра, в который встроена некоторая логика.
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
Наследование
Наследование можно определить как процесс, в котором один класс приобретает свойства (методы и поля) другого. С использованием наследования информация становится управляемой в иерархическом порядке.
Класс, который наследует свойства другого, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, известен как суперкласс (базовый класс, родительский класс).
Расширяется
extendsключевое слово, используемое для наследования свойств класса. Ниже приводится синтаксис ключевого слова extends. В следующем примере мы делаем следующие вещи -
Создание класса под названием 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 в нашем внешнем классе.
- Создание внутреннего или вложенного класса внутри нашего внешнего класса.
- Обратите внимание, что во внутреннем классе мы можем получить доступ к члену экземпляра имени, определенному во внешнем классе.
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. Интерфейс определяет только сигнатуры методов. Методы интерфейса всегдаpublic. Использование защищенных или частных методов в интерфейсах является ошибкой.
Ниже приведен пример интерфейса в Groovy. В следующем примере мы делаем следующие вещи -
Создание интерфейса под названием 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);
}
}
Когда мы запустим вышеуказанную программу, мы получим следующий результат -
10
null