- •Тема 5. Создание пользовательских классов в Java
- •Тема 5. Создание пользовательских классов
- •Поля (переменные экземпляра)
- •Конструкторы
- •У них нет типа; они всегда возвращают ссылку к экземпляру класса;
- •Самый простой конструктор не содержит параметров и не имеет никакого кода. Такой конструктор инициализирует значения полей, равные 0.
- •Void init(int a,int b) // модифицирующий метод, изменяющий
- •? Упражнения
Void init(int a,int b) // модифицирующий метод, изменяющий
{ // значения полей х,у класса Point1
x=a;
y=b;
}
}
Пример (класс Point содержит закрытые поля, два конструктора и методы getX и setX):
public class Point // заголовок класса
{
private int x,y; // объявление полей х,у – закрытые поля
public Point() // объявление конструктора без параметров
{
x = 0;
y = 0;
}
public Point(int init_x, int init_y) // объявление конструктора
// с параметрами
{
x = init_x;
y = init_y;
}
public int getХ() // общий метод доступа – возвращает
// значение поля х, не изменяя его
{
return x;
}
public void setХ(int newX) // общий модифицирующий метод – изменяет
// значение поля х
{
x = newX;
}
}
Метод доступа getХ:
объявлен общим (public);
является методом доступа – возвращает значение поля х, не изменяя его;
имеет тип int; чтобы быть синтаксически и логически правильным, код для такого метода должен заканчиваться возвращением константы или какой-либо переменной этого типа.
не принимает параметры.
Метод доступа setХ:
объявлен общим (public);
является модифицирующим методом – изменяет значение поля х;
имеет тип void; метод не возвращает значений, и код для метода не содержит выражения для возвращения;
принимает параметр newX, и, как и в конструкторе, параметр имеет определенный тип данных (int). Метод присваивает значение параметра полю объекта.
В программе, использующей класс Point, получить доступ или изменить значение поля Х в объекте класса Point можно только с помощью методов getX и setX. Однако в коде, находящемся внутри определения класса, возможен прямой доступ к полям данного класса.
Пример (фрагмент кода тестовой программы, в которой создается и используется объект класса Point):
Point myPoint = new Point();
int myX = myPoint.getX();
System.out.println(myX);
myPoint.setX(4,8);
myX = myPoint.getX();
System.out.println(myX);
Результат работы фрагмента тестовой программы:
0
4
Добавим в объявление класса Point метод moveX, позволяющий переместить точку (т.е. объект класса Point) по горизонтали на заданное значение.
Пример (класс Point с добавленным методом moveX):
public class Point // заголовок класса
{
private int x,y; // объявление полей х,у – закрытые поля
public Point() // объявление конструктора без параметров
{
x = 0;
y = 0;
}
public Point(int init_x, int init_y) // объявление конструктора
// с параметрами
{
x = init_x;
y = init_y;
}
public int getХ() // общий метод доступа – возвращает
// значение поля х, не изменяя его
{
return x;
}
public void setХ(int newX) // общий модифицирующий метод – изменяет
// значение поля х
{
x = newX;
}
public void moveX(int addX)
{
x = x + addX;
}
}
Логика класса может быть проверена только программой, которая им пользуется. Полная тестовая программа должна использовать все конструкторы и методы, определенные в классе, и выдать на экран сообщение, которое позволит пользователю определить, достигнут ли желаемый эффект.
Пример тестовой программы для класса Point:
/* Эта тестовая программа проверяет все конструкторы
и все методы класса Point */
public class TestPoint
{
public static void main(String[] args)
{
Point myPoint1; // создается объект myPoint1 класса Point2
Point myPoint2; // создается объект myPoint2 класса Point2
// Проверяет конструктор, который не принимает параметров
int someX = 5;
myPoint1 = new Point;
myPoint1.setX(someX);
someX = myPoint1.getX();
System.out.println("myPoint1 X: " + someX);
// Проверяет конструктор, который принимает параметры
someX = 7;
int someY = 12;
myPoint2 = new Point(someX,someY);
someX = myPoint2.getX();
System.out.println("myPoint2 X: " + someX);
// Проверяет метод moveX
someX = 9;
myPoint2.moveХ(someX);
someX = myPoint2.getX() ;
System.out.println("after moving myPoint2 X: " + someX);
}
Результаты работы тестовой программы:
myPoint1 X: 5
myPoint2 X: 7
after moving myPoint2 X: 16