Top.Mail.Ru

Перечень уроков по Java

15. Практика. Классы

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

Ввыполним проектирование класса. Для описания заданных плоских геометрических фигур достаточно следующих параметров:

  • круг – один параметр. Это  радиус круга,
  • прямоугольник – два параметра. Это длины сторон,
  • трапеция – три параметра. Это длины сторон трапеции  и высота.

Таким образом, класс описания плоских фигур круг, прямоугольник, трапеция класс должен иметь три поля:

int a;
int b;
int c.

 Далее, нам необходимы три конструктора:

  • конструктор создания круга,
  • конструктор создания прямоугольника,
  • конструктор создания трапеции,

а также конструктор по умолчанию, для работы с массивом объектов.

Кроме того, необходимы методы, с помощью которых можно изменить  значения полей.  В именах подобных методов принято использовать префиксы: set – для изменения  и get – для чтения значений полей. Запишем имена методов.  setA(int A) – установить значение  поля a, соответственно b и c:

              setA(int A),
        setB(int B),
        setC(int C).

 И наконец, обозначим  метод вычисления  площади фигур - getArea().

Теперь все готово для записи класса Figura.     

public class Figura {

    //private (закрытые) поля класса

   private int a;

   private int b;

   private int c;

  //конструктор по умолчанию

   public Figura(){};

   //конструктор круга

   //здесь а - радиус круга, поля b, c не используются, значения им не

   //задаются и по умолчанию им будет присвоено значение 0.

   public Figura(int A)

   {

       a=A;

   }

   //конструктор прямоугольника

   //здесь a, b - стороны прямоугольника, с не используется 

   public Figura (int A, int B)

   {

       a=A; b=B;

   }

   //конструктор трапеции

   //здесь a, b - стороны трапеции, с - высота трапеции

   public Figura (int A, int B, int C)

   {

       a=A; b=B; c=C;

   }

   //метод устанавливающий значение поля a

   public void setA(int A)

   {

   a=A;

   }

   //метод устанавливающий значение поля b

   public void setB(int B)

   {

   b=B;

   }

   //метод устанавливающий значение поля c

   public void setC(int C)

   {

   c=C;

   }

   //метод, вычисляющий площадь фигуры по ее номеру

   //N - номер фигуры

   //1 - круг, 2 - прямоугольник, 3 - трапеция  

   public double getArea(int N)

   {

      switch(N)

      {

          case 1: return a*a*Math.PI;  //площадь круга

          case 2: return a*b;          //площадь прямоугольника

          case 3: return (a+b)*c/2;    //площадь трапеции

      }

          return 0;   

   }

}

Инкапсуляция

В классе Figura три  скрытых поля:

   //private (закрытые) поля класса
 private int a;
 private int b;
 private int c,

доступ к которым возможет только  с помощью методов setA(int A), setB(int B), setC(int C).

Инкапсуляция позволяет ограничить доступ к элементам класса, так что вне класса,  например, в другом классе  или в программе - функция main(), нет доступа к полям объектов a,b,c. Для примера создадим объект и попробуем присвоить полю a значение

public static void main(String[] args) {

//создаем объект круг, вызвав конструктор круга

Figura f1= new Figura(1);

//пытаемся присвоить полю a значение

f1.a=2;          //операция не допустима. Поле a имеет private доступ

//используя метод полю a  можно присвоить значение

f1.setA(2);    //операция допустима. Доступ возможен.

}

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

Если в классе Figura объявить эти же  поля без указания модификатора доступа

int a;
int b;
int c,

то поля будут иметь модификатор доступа  по умолчанию и будут доступны всем классам в текущем пакете

 Пример.

 

 

public static void main(String[] args) {

//создаем объект круг, вызвав конструктор круга

Figura f1= new Figura(1);

//пытаемся присвоить полю a значение

f1.a=2;                 // операция допустима

}

 

Сделав поля закрытыми, мы получаем преимущество: методы изменения значений полей - setA() могут выполнять проверку ошибок, а вот при   прямом присваивании ошибок не выявляется.  

 

Методы set

 Рассмотрим методы

    public void setA(int A),

  public void setB(int B),

  public void setC(int C).

Они имеют доступ к закрытым полям (a,b,c) всех объектов своего класса.

Сами же методы являются открытыми (public), поскольку служат для взаимодействия с объектами. 

                         Конструкторы

 Конструктор – предназначен для инициализации объекта. Основными свойствами конструктора являются:

  • Имя конструктора совпадает с именем класса.
  • Класс может иметь несколько конструкторов.
  • Конструктор не возвращает значение, даже void.
  • Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
  • Конструктор вызывается совместно с операцией new.

 Класс Figura имеет три конструктора с параметрами и один конструктор по умолчанию.

  

Метод main()

Основная программа представляет статический метод main(). Статический метод можно вызвать, не имея не одного объекта класса. В методе main() с помощью вызова конструкторов создаются объекты, для последующей работы с ними. Конструктор всегда вызывается совместно с операцией new.

 

 

public class MyFigura {

       public static void main(String[] args) {

        double s;

       // создаем объект круг, радиусом 1    

        Figura f1= new Figura(1);

        s= f1.getArea(1);

        System.out.println("площадь круга: "+s);

       // создаем объект прямоугольник, задаем длины сторон прямоугольника a=1, b=1

        Figura f2= new Figura(1,1);

        s= f2.getArea(2);

        System.out.println("площадь прямоугольника: "+s);

       

        // создаем объект трапеция, задаем длины сторон a=1, b=1, высоту с= 1

        Figura f3= new Figura(1,1,1);

        s= f3.getArea(3);

        System.out.println("площадь трапеции: "+s);

       

      //определяем массив ссылок для трех объектов: круг, прямоугольник, трапеция

        Figura [] mf = new   Figura [3];

        //создаем три объекта,  используя конструктор по умолчанию

        mf[0] = new Figura();

        mf[1] = new Figura();

        mf[2] = new Figura();

       

        //для первого объекта задаем  радиус  круга

        mf[0].setA(1);

       //для второго объекта задаем  длины сторон прямоугольника

        mf[1].setA(1); mf[1].setB(1);

        //для третьего объекта задаем  длины сторон трапеции

        mf[2].setA(1); mf[2].setB(1); mf[2].setC(1);

       

        s= mf[0].getArea(1);

        System.out.println("площадь круга: "+s);

        s= mf[1].getArea(2);

        System.out.println("площадь прямоугольник: "+s);

        s= mf[2].getArea(3);

        System.out.println("площадь трапеции: "+s);

    }

   

}

 

Результат работы программы:

площадь круга: 3.141592653589793
площадь прямоугольника: 1.0
площадь трапеции: 1.0
площадь круга: 3.141592653589793
площадь прямоугольника: 1.0
площадь трапеции: 1.0

 

Пояснения.

В программе для создания объектов используются конструкторы круга, прямоугольника, трапеции. Метод getArea() вычисляет площадь этих фигур.

Для демонстрации работы  с конструктором по умолчанию создается массив ссылок на объекты типа Figura.

         Figura [] mf = new   Figura [3];

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

           mf[0] = new Figura();
        mf[1] = new Figura();
        mf[2] = new Figura();

И наконец,  с помощью методов setA(),setB(),setC() задаются требуемые значения объектам.