Переменные класса и константы

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

cпецификатор тип имя;

В языке Java могут использоваться переменные класса, объявленные один раз для всего класса со спецификатором static и одинаковые для всех экземпляров класса, или переменные экземпляра, создаваемые для каждого экземпляра класса. Переменные объявляются со спецификаторами доступа public, private, protected или по умолчанию без спецификатора. Кроме данных – членов класса в классе используются локальные переменные и параметры методов. Переменные со спецификатором final являются константами. Спецификатор final можно использовать для переменной, объявленной в методе, а также для параметра метода.

Объявить и проинициализировать значения переменных класса и локальных переменных метода, а также параметры метода можно следующим образом:

/* пример # 1 : типы атрибутов и переменных : MyClass.java */

class MyClass {

int x; // переменная экземпляра класса

int y = 2; // переменная экземпляра класса

final int YEAR = 2003; // константа

static int bonus; // переменная класса

static int b = 1; // переменная класса

void init(int z){// параметр метода

z = 3;// переинициализация

int a;// локальная переменная метода

a = 4;// инициализация

}

}

В приведенном примере использованы данные базовых типов, не являющиеся ссылками на объекты. Данные могут быть ссылками, назначить которым реальные объекты можно с помощью оператора new.

Ограничение доступа

Java предоставляет несколько уровней защиты, обеспечивающих возможность настройки области видимости данных и методов. Из-за наличия пакетов Java должна уметь работать с четырьмя категориями видимости между элементами классов:

· классы и подклассы в том же пакете (по умолчанию);

· независимые классы (private);

· подклассы в текущем и других пакетах (protected);

· классы, которые не являются подклассами и не входят в тот же пакет (public).

Элемент (атрибут или метод), объявленный public, доступен из любого места вне класса. Все, что объявлено private, доступно только внутри класса и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета. Именно такой уровень доступа используется по умолчанию. Если же необходимо, чтобы элемент был доступен из другого пакета, но только подклассам того класса, которому он принадлежит, нужно объявить такой элемент со спецификатором protected.

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

Конструктор - это метод, который автоматически вызывается при создании объекта класса и выполняет действия по инициализации объекта. Конструктор имеет то же имя, что и класс; вызывается не по имени, а только вместе с ключевым словом newпри создании экземпляра класса. Конструктор не возвращает значение, но может иметь параметры и быть перегружаемым.

Деструкторы в языке Java не используются, объекты уничтожаются сборщиком мусора после прекращения их использования. Аналогом деструкторов являются методы finalize(). Исполняющая среда языка Java будет вызывать их каждый раз, когда сборщик мусора будет уничтожать объекты этого класса, которым не соответствует ни одна ссылка.

/* пример # 2 : перегрузка конструктора : NewBook.java */

class NewBook {

private String title, publisher;

private float price;

public NewBook() {

title = “NoTitle”;

}

public NewBook(String t, String pub, float p) {

title = new String(t);

publisher = pub;

price = p;

}

}

Объект класса NewBook может быть создан двумя способами, вызывающими один из конструкторов:

NewBook tips1; // объявление

tips1 = new NewBook();// инициализация

NewBook tips2 = new NewBook("Java2", "Ноутон", 9.f);

Оператор newвызывает конструктор, поэтому в круглых скобках могут стоять аргументы, передаваемые конструктору.

Если конструктор в классе не определен, Java предоставляет конструктор по умолчанию, который инициализирует объект значениями по умолчанию. Если же конструктор с параметрами определен, то конструктор по умолчанию становится недоступным и для его вызова необходимо явное объявление такого конструктора.

В следующем примере объявлен класс Locate c двумя полями (атрибутами), конструктором и методами для инициализации и извлечения значений атрибутов.

/* пример # 3 : вычисление расстояния между точками : Distance.java */

class Locate {

private double x, y; /*по умолчанию x=0 и y=0 */

publicLocate(){

x = 1;

y = 1;

}

public void setX(double a){

x = a;

}

void setY(double b){ /*видимость по умолчанию*/

y = b;

}

public double getX(){

return x;

}

public double getY(){

return y;

}

}

public class Distance {

public static void main(String[] args) {

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

Locate t1 = new Locate();

Locate t2 = new Locate();

double dx, dy, distance;

t1.setX(5);

t1.setY(10);

t2.setX(2);

t2.setY(6);

dx = t1.getX() - t2.getX();

dy = t1.getY() - t2.getY();

/* вычисление расстояния */

distance = Math.sqrt(dx*dx + dy*dy);

//distance = Math.hypot(dx, dy);//java 5.0

System.out.print("расстояние равно: " + distance);

}

}

В результате будет выведено:

Расстояние равно: 5.0

Здесь используется статические методы sqrt() (или hypot()) из класса Math, которые вызываютсябез объявления объекта указанного класса. Класс Math содержит только статические методы для физических и технических расчетов, а также константы E и PI.

Логические блоки

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

{ /* код */ }

Логические блоки чаще всего используются в качестве инициализаторов полей, но могут содержать вызовы методов как текущего класса, так и не принадлежащих ему. При создании объекта класса они вызываются последовательно, в порядке размещения, вместе с инициализацией полей как простая последовательность операторов, и только после выполнения последнего блока будет вызван конструктор класса. Операции с полями класса внутри логического блока до явного объявления этого поля возможны только при использовании ссылки this, которая, как и в С++, представляет собой ссылку на текущий объект.

Логический блок может быть объявлен со спецификатором static. В этом случае он вызывается всегда перед вызовом статического метода данного класса.

/* пример # 9 : использование логических блоков при объявлении класса : DemoLogic.java */

public class DemoLogic {

{

System.out.println("логический блок(1) x="

+ this.x);

}

private int x = 1;

public DemoLogic() {

System.out.println("конструктор");

}

int getX(){

return x;

}

{

x = 2;

System.out.println("логический блок(2) x=" + x);

}

public static void main(String[] args) {

DemoLogic obj = new DemoLogic();

System.out.println("значение х="

+ obj.getX());

}

}

В результате выполнения этой программы будет выведено:

логический блок(1) x=0

логический блок(2) x=2

Конструктор

значение х=2

В первой строке вывода поле x получит значение по умолчанию, так как память для него выделена при создании объекта, а значение еще не проинициализировано. Во второй строке выводится значение x равное 2, так как после инициализации атрибута класса был вызван логический блок, изменивший его значение.

Методы

С помощью шаблонов можно создавать родовые (generic) классы и методы, что позволяет использовать более строгую типизацию, например при работе с коллекциями. Применение классов-шаблонов для создания типизированных коллекций будет рассмотрено в главе 10.

Пример класса-шаблона с двумя параметрами:

class MyTempl < T1, T2 > {

T1 value1;

T2 value2;

}

Здесь T1, Т2 – фиктивные типы, которые используются при объявлении атрибутов класса. Компилятор заменит все фиктивные типы на реальные и создаст соответствующий им объект. Объект класса MyTempl можно создать, например, следующим образом:

MyTempl < Integer, Byte > ob =

new MyTempl < Integer, Byte > ();

В предложенном примере полностью приведено объявление класса CurrentType с конструкторами и методами.

/* пример # 10 : создание и использование объектов параметризованного класса : DemoTemplate.java */

class CurrentType < T > {

T value;

CurrentType(){}

CurrentType(T value){

this.value = value;

}

T getValue() {

return this.value;

}

void setValue (T value) {

this.value = value;

}

}

public class DemoTemplate {

public static void main(String [] args){

CurrentType < Integer > ob1;

ob1 = new CurrentType < Integer > ();

ob1.setValue(new Integer(7));

System.out.println(ob1.getValue());

CurrentType < String > ob2 =

new CurrentType <String> ("Java");

System.out.println(ob2.getValue());

}

}

В классе DemoTemplate созданы два объекта: ob1 на основе типа
Integer и ob2 на основе типа String при помощи различных конструкторов.

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

classMyTemplExt < T extends Number > {

T value;

}

Такая запись говорит о том, что в качестве типа Т разрешено применять только классы, являющиеся наследниками класса Number.

В качестве параметров классов запрещено применять базовые типы.

Задание

Создать описанные ниже классы. Определить конструктор и методы set(), get(), show(). Определить дополнительно какой – либо метод для каждого класса. Реализовать класс в консольном приложении. Задать критерий выбора данных и вывести эти данные на консоль.

1. Student : id, Фамилия, Имя, Отчество, Дата рождения, Адрес, Телефон, Факультет, Курс.

2. Customer: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Номер банковского счета.

3. Patient: id, Фамилия, Имя, Отчество, Адрес, Телефон, Номер медицинской карты, диагноз.

4. Abiturient: id, Фамилия, Имя, Отчество, Адрес, Телефон, Оценки.

5. BOOK: id, Название, Автор(ы), Издательство, Количество страниц, Цена, Переплет.

6. House: id, Номер, Адрес, Тип здания, Количество этажей, Количество квартир, Срок эксплуатации.

7. Phone: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Дебет, Кредит.

8. Car: id, Марка, Модель, Год выпуска, Цвет, Цена, Регистрационный номер.

9. Product (Товар): id, Наименование, UPC, Производитель, Цена, Срок хранения, Количество.

Наши рекомендации