Учебники

Groovy — Объектно-ориентированный

В 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 и предоставление методов получения и установки для установки и получения значений переменных экземпляра соответственно. В следующем примере показано, как это можно сделать.

Live Demo

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) и вызываем их члены экземпляра и методы экземпляра соответственно.

Live Demo

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.

Live Demo

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.

Live Demo

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, в котором нет деталей реализации. В студенческом классе обязательно добавить детали реализации.

Live Demo

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.

Live Demo

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);
   }
}

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