АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вопрос 2.4

Читайте также:
  1. E. Некорректный вопрос
  2. I. Перечень вопросов и тем для подготовки к экзамену
  3. II. Вопросительное предложение
  4. VII. Вопросник для анализа учителем особенностей индивидуального стиля своей педагогической деятельности (А.К. Маркова)
  5. X. примерный перечень вопросов к итоговой аттестации
  6. Аграрный вопрос
  7. Анализ влияния рекламы на продвижение противопростудных средств
  8. Балканский вопрос в начале XXв. Русско-германские отношения
  9. Бланк вопросов
  10. БЛОК № 1 (1 – 10 вопрос)
  11. БЛОК № 2 (11 – 20 вопрос)
  12. Блок № 4 (31 – 40 вопрос)

Какие из приведенных объявлений массивов корректны?

int a1[] = {};

int a2[] = new int []{1,2,3};

int a3[] = new int [](1,2,3);

int a4[] = new int [3];

int a5[] = new int [3]{1,2,3};

1) a1;

2) a2;

3) a3;

4) a4;

5) a5.

 
Глава 3

КЛАССЫ

Класс представляет описание совокупности объектов с общими атрибутами, методами, отношениями и семантикой.

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

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

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

Определение простейшего класса без наследования имеет вид:

class ИмяКласса {

{} //логические блоки

// дружественные данные и методы

private // закрытые данные и методы

protected // защищенные данные и методы

public // открытые данные и методы

}

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

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

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

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

Переменные со спецификатором final являются константами. Специфи­катор final можно использовать для переменной, объявленной в методе, а также для параметра метода.

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

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

package chapt03;

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;

}

}

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

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

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

· по умолчанию – дружественные члены класса доступны классам, находящимся в том же пакете;

· private – члены класса доступны только членам данного класса;

· protected – члены класса доступны классам, находящимся в том же пакете, и подклассам – в других пакетах;

· public – члены класса доступны для всех классов в этом и других пакетах.

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

Спецификатор доступа public может также стоять перед определением внешнего (enclosing) класса. Если данный спецификатор отсутствует, то класс недоступен из других пакетов.

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

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

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

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

package chapt03;

 

public class Quest {

private int id;

private String text;

// конструктор без параметров (по умолчанию)

public Quest() {

super (); /* если класс будет объявлен без конструктора, то

компилятор предоставит его именно в таком виде*/

}

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

public Quest(int idc, String txt) {

super (); /*вызов конструктора суперкласса явным образом

необязателен, компилятор вставит его автоматически*/

id = idc;

text = txt;

}

}

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

Quest a = new Quest(); //инициализация полей значениями по умолчанию

Quest b = new Quest(71, "Сколько бит занимает boolean?");

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

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

super( параметры );

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

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

package chapt03;

 

public class Point {

/* объект инициализируется при создании и не изменяется */

private final double x;

private final double y;

 

public Point(final double xx, final double yy) {

super ();

x = xx;

y = yy;

}

public double getX() {

return x;

}

public double getY() {

return y;

}

}

package chapt03;

 

public class LocateLogic {

public double calculateDistance(

Point t1, Point t2) {

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

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

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

return Math. hypot (dx, dy);

}

}

package chapt03;

public class Runner {

public static void main(String[] args) {

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

Point t1 = new Point(5, 10);

Point t2 = new Point(2, 6);

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

+ new LocateLogic().calculateDistance(t1, t2));

}

}

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

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

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

Методы

Изобретение методов является вторым по важности открытием после создания компьютера. Метод – основной элемент структурирования хода.

Все функции Java объявляются только внутри классов и называются методами. Простейшее определение метода имеет вид:

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

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

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

}

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

objectName.methodName();

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

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

[доступ] [static] [abstract] [final] [native]

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

[throws список_исключений]

Как и для полей класса, спецификатор доступа к методам может быть public, private, protected и по умолчанию. При этом методы суперкласса можно перегружать или переопределять в порожденном подклассе.

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

Статические методы и поля

Поля данных, объявленные в классе как static, являются общими для всех объектов класса и называются переменными класса. Если один объект изменит значение такого поля, то это изменение увидят все объекты. Для работы со статическими атрибутами используются статические методы, объявленные со спецификатором static. Такие методы являются методами класса, не привязаны ни к какому объекту и не содержат указателя this на конкретный объект, вызвавший метод. Статические методы реализуют парадигму «раннего связыва­ния», жестко определяющую версию метода на этапе компиляции. По причине недоступности указателя this статические поля и методы не могут обращаться к нестатическим полям и методам напрямую, так как для обращения к статическим полям и методам достаточно имени класса, в котором они определены.

// пример # 4: статические метод и поле: Mark.java

package chapt03;

 

public class Mark {

private int mark = 3;

public static int coeff = 5;

 

public double getResult() {

return (double) coeff *mark/100;

}

public static void setCoeffFloat(float c) {

coeff = (int) coeff*c;;

}

public void setMark(int mark) {

this. mark = mark;

}

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

/*public static int getResult() {

setMark(5);//ошибка

return coeff*mark/100;//ошибка

}*/

}

При создании двух объектов

Mark ob1 = new Mark();

Mark ob2 = new Mark();

Значение ob1.coeff и ob2.coeff и равно 5, поскольку располагается в одной и той же области памяти. Изменить значение статического члена можно прямо через имя класса:

Mark.coeff = 7;

Вызов статического метода также следует осуществлять с помощью указания:
ClassName. methodName (), а именно:

Mark. setCoeffFloat ();

float z = Math. max (x, y); // определение максимума из двух значений

System. exit (1); // экстренное завершение работы приложения

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

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

Модификатор final

Модификатор final используется для определения констант в качестве члена класса, локальной переменной или параметра метода. Методы, объявленные как final, нельзя замещать в подклассах, для классов – создавать подклассы. Например:

/* пример # 5: final-поля и методы: Rector.java: ProRector.java */

package chapt03;

 

public class Rector {

 

// инициализированная константа

final int ID = (int)(Math. random ()*10);

// неинициализированная константа

final String NAME_RECTOR;

 

public Rector() {

// инициализация в конструкторе

NAME_RECTOR = "Старый"; // только один раз!!!

}

// {NAME_RECTOR = "Новый";} // только один раз!!!

 

public final void jobRector() {

// реализация

// ID = 100; //ошибка!

}

public boolean checkRights(final int num) {

// id = 1; //ошибка!

final int CODE = 72173394;

if (CODE == num) return true;

else return false;

}

public static void main(String[] args) {

System. out. println(new Rector().ID);

}

}

package chapt03;

 

public class ProRector extends Rector {

// public void jobRector(){} //запрещено!

}

Константа может быть объявлена как поле класса, но не проинициали­зирована. В этом случае она должна быть проинициализирована в логическом блоке класса, заключенном в {}, или конструкторе, но только в одном из указанных мест. Значение по умолчанию константа получить не может в отличие от переменных класса. Константы могут быть объявлены в методах как локальные или как параметры метода. В обоих случаях значения таких констант изменять нельзя.

Абстрактные методы

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

/* пример # 6: абстрактный класс и метод: AbstractCourse.java */

public abstract class AbstractCourse {

private String name;

public AbstractCourse() { }

public abstract void changeTeacher(int id); /*определение

метода отсутствует*/

public setName(String n){

name = n;

}

}

В отличие от интерфейсов, абстрактный класс может содержать и абстрактные, и неабстрактные методы, а может и не содержать ни одного абстрактного метода.

Подробнее абстрактные класса и интерфейсы изучаются в главе «Абстрактные классы. Интерфейсы. Пакеты».

Модификатор native

Приложение на языке Java может вызывать методы, написанные на языке С++. Такие методы объявляются с ключевым словом native, которое сообщает компилятору, что метод реализован в другом месте. Например:

public native int loadCripto(int num);

Методы, помеченные native, можно переопределять обычными методами в подклассах.

Модификатор synchronized

При использовании нескольких потоков управления в одном приложении необходимо синхронизировать методы, обращающиеся к общим данным. Когда интерпретатор обнаруживает synchronized, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении. Вызов методов уведомления о возвращении блокировки объекта notifyAll(), notify() и метода остановки потока wait() класса Object (суперкласса для всех классов языка Java) предполагает использование модификатора synchronized, так как эти методы предназначены для работы с потоками.

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

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

{ /* код */ }

static { /* код */ }

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

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

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

Department.java: DemoLogic.java */

package chapt03;

 

public class Department {

{

System. out. println("logic (1) id=" + this. id);

}

static {

System. out. println("static logic");

}

private int id = 7;

 

public Department(int d) {

id = d;

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

}

int getId() {

return id;

}

{

id = 10;

System. out. println("logic (2) id=" + id);

}

}

package chapt03;

 

public class DemoLogic {

public static void main(String[] args) {

Department obj = new Department(71);

System. out. println("значение id=" + obj.getId());

}

}

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

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



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.031 сек.)