Переменные класса и константы. Ограничение доступа. Конструкторы. Методы.




Классы-оболочки

Кроме базовых типов данных, в языке Java широко используются соответствующие классы-оболочки (wrapper-классы) из пакета java.lang: Boolean, character, Integer, Byte, Short, Long, Float, Double. Объекты этих классов могут хранить те же значения, что и соответствующие им базовые типы.

Объекты этих классов представляют ссылки на участки динамической памяти, в которой хранятся их значения, и являются классами-оболочками для значений базовых типов. Классы, соответствующие числовым базовым типам, находятся в библиотеке java.lang, являются наследниками абстрактного класса Number и реализуют интерфейс Comparable, представляющий собой интерфейс для определения возможности сравнения объектов одного типа между собой. Объекты классов-оболочек по умолчанию получают значение null. Объекты класса могут быть преобразованы к любому базовому типу методами типValue() или обычным присваиванием. Класс Character имеет целый ряд специфических методов для обработки символьной информации. У класса Character, в отличие от других классов оболочек, не существует конструктора с параметром типа String.

Метод valueOf(String str) определен для всех классов-оболочек, соответствующих примитивным типам, и выполняет действия по преобразованию значения, заданного в виде строки, к значению соответствующего объектного типа данных.

Автораспаковка – процесс извлечения из объекта-оболочки значения базового типа. Вызовы таких методов, как intValue(), doubleValue() становятся излишними.

Операторы управления

Оператор выбора if имеет следующий синтаксис:

if (boolexp) { /*операторы*/} //1

else { /*операторы*/ } //2

Если выражение boolexp принимает значение true, то выполняется группа операторов 1, иначе – группа операторов 2. При отсутствии оператора else операторы, расположенные после окончания оператора if (строка 2), выполняются вне зависимости от значения булевского выражения оператора if. Допустимо также использование конструкции-лесенки if {} else if {}.

Аналогично C++ используется оператор switch:

switch(exp) {

case exp1:{/*операторы*/}

break;

case expN:{/*операторы*/}

break;

default: {/*операторы*/}

}

Операторы условного перехода следует применять так, чтобы нормальный ход выполнения программы был очевиден. После if следует располагать код, удовлетворяющий нормальной работе алгоритма, после else побочные и исключительные варианты. Аналогично для оператора switch нормальное исполнение алгоритма следует располагать в инструкциях case (наиболее вероятные варианты размещаются раньше остальных), альтернативное или для значений по умолчанию – в инструкции default.

 

Массивы.

Массив представляет собой объект, где имя массива является объектной ссылкой. Элементами массива могут быть значения базового типа или объекты. Индексирование элементов начинается с нуля. Все массивы в языке Java являются динамическими, поэтому для создания массива требуется выделение памяти с помощью оператора new или прямой инициализации. Значения элементов неинициализированного массива, для которого выделена память, устанавливаются в значения по умолчанию для массива базового типа или null для массива объектных ссылок. Для объявления ссылки на массив можно записать пустые квадратные скобки после имени типа, например: int a[]. Аналогичный результат получится при записи int[] a.

public class ArrRef {

public static void main(String[] args) {

int myRef[], my;// объявление ссылки на массив и пере

float[] myRefFloat, myFloat; // два массива! // объявление с инициализацией нулевыми значениями по ум.

int myDyn[] = new int[10];

/*объявление с инициализацией */

int myInt[] = {5, 7, 9, -5, 6, -2};//6 элемент

byte myByte[] = {1, 3, 5};//3 элемента

/*объявление с помощью ссылки на Object */

Object myObj = new float[5]; // допустимые присваивания ссылок

myRef = myDyn;

myDyn = myInt;

myRefFloat = (float[])myObj;

myObj = myByte;// источник ошибки для следующей стр

myRefFloat = (float[])myObj;// ошибка выполнения

// недопустимые присваивания ссылок (нековариантность)

// myInt = myByte;

//myInt = (int[])myByte;

} }

Ссылка на Object может быть проинициализирована массивом любого типа и любой размерности. Обратное действие требует обязательного приведения типов и корректно только в случае, если тип значений массива и тип ссылки совпадают. Если же ссылка на массив объявлена с указанием типа, то она может содержать данные только указанного типа и присваиваться другой ссылке такого же типа. Приведение типов в этом случае невозможно. Массив представляет собой безопасный объект, поскольку все элементы инициализируются и доступ к элементам невозможен за пределами границ. Размерность массива хранится в его свойстве length. Многомерных массивов в Java не существует, но можно объявлять массив массивов. Массивы объектов фактически не отличаются от массивов базовых типов.

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

 

Класс Маth.

Класс java.lang.Math содержит только статические методы для физических и технических расчетов, а также константы E и PI. Все методы класса вызываются без создания экземпляра класса (создать экземпляр класса Math невозможно). В классе определено большое количество методов для математических вычислений, а также ряд других полезных методов, таких как floor(), ceil(), rint(), round(), max(), min(), которые выполняют задачи по округлению, поиску экстремальных значений, нахождению ближайшего целого и т.д. Рассмотрим пример обработки значения случайного числа, полученного с помощью метода random() класса Math.

/* пример # 11: использование методов класса Math: MathMethods.java */

public class MathMethods {

public static void main(String[] args) {

final int MAX_VALUE = 10;

double d;

d = Math.random() * MAX_VALUE;

System.out.println("d = " + d);

System.out.println("Округленное до целого =" + Math.round(d));

System.out.println("Ближайшее целое, " + " <= исходного числа =" + Math.floor(d));

System.out.println("Ближайшее целое, " + " >= исходного числа =" + Math.ceil(d));

System.out.println("Ближайшее целое значение" + "к числу =" + Math.rint(d));

 

Переменные класса и константы. Ограничение доступа. Конструкторы. Методы.

Классы инкапсулируют переменные и методы – члены класса. Переменные класса объявляются в нем следующим образом: cпецификатор тип имя;

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

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

import java.util.*;

class Second {

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

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

public final int CURRENT_YEAR = 2007; // константа

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

static String version = "Java SE 6"; // переменная класса

protected Calendar now;

public int method(int z) { // параметр метода

z++;

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

//a++; // ошибка компиляции, значение не задано

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

a++;

now = Calendar.getInstance();//инициализация

return a + x + y + z;} }

 

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

по умолчанию – дружественные члены класса доступны классам, находящимся в том же пакете; private – члены класса доступны только членам данного класса; protected – члены класса доступны классам, находящимся в том же пакете, и подклассам – в других пакетах; public – члены класса доступны для всех классов в этом и других пакетах.

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

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

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

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

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

Конструктор объявляется со спецификатором public, чтобы была возможность вызывать его при создании объекта в любом пакете приложения. Спецификатор private не позволяет создавать объекты вне класса, а спецификатор «по умолчанию» – вне пакета.

Спецификатор protected позволяет создавать объекты в текущем пакете и для подклассов в других пакетах.

Методы

Метод – основной элемент структурирования хода.Простейшее определение метода имеет вид:

returnType methodName(список_параметров) {

// тело метода

return value; // если нужен возврат значения (returnType не void)

}

Если метод не возвращает значение, ключевое слово return может отсутствовать, тип возвращаемого значения в этом случае будет void. Вместо пустого списка параметров метода тип void не указывается, а только пустые скобки. Вызов методов осуществляется из объекта или класса (для статических методов): objectName.methodName();

Методы-конструкторы по имени вызываются автоматически только при создании объекта класса с помощью оператора new. Объявление метода как минимум должно содержать тип возвращаемого значения (возможен void) и имя метода.

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: