Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
// Усовершенствованный класс очереди, предназначенной
// для хранения символьных значений,
class Queue {
// Следующие члены класса теперь являются закрытыми,
private char q[]; // Массив для хранения элементов очереди
private int putloc, getloc; // Индексы размещения и извлечения
// элементов очереди
Queue(int size) {
q = new char[size+1]; // выделить память для очереди
putloc = getloc = 0;
}
// поместить символ в очередь
void put(char ch) {
if(putloc==q.length-1) {
System.out.println(" - Queue is full.");
return;
}
putloc++;
q[putloc] = ch;
}
// извлечь символ из очереди
char get () {
if(getloc == putloc) {
System.out.println(" - Queue is empty.");
return (char) 0;
}
getloc++;
return q[getloc];
}
}
Изменение типа доступа к массиву q и переменным putloc и getloc с выбираемого по умолчанию на закрытый (private) никак не скажется на работе тех программ, где класс Queue используется правильно. В частности, этот класс будет по-прежнему взаимодействовать с классом QDemo, созданным в примере для опробования 5.2. В то же время неправильное обращение к классу Queue станет невозможным. Например, следующий фрагмент кода недопустим:Queue test = new Queue(lO);
test.q[0] =99; // Ошибка!
test.putloc = -100; // He пройдет!
Теперь, когда массив q и переменные putloc и getloc стали закрытыми, класс Queue строго следует принципу “первым пришел — первым обслужен”, по которому действует очередь.
Передача объектов методам
В приведенных ранее примерах программ в качестве параметров методам передавались лишь простые типы. Но параметрами могут быть и объекты. Например, в привеское значение true только в том случае, если все три размера обоих параллелепипедов совпадают. А в методе same Volume () сравниваются лишь объемы двух параллелепипедов. Но в обоих случаях параметр ob имеет тип Block. Несмотря на то что Block — это класс, параметры данного типа используются таким же образом, как и параметры встроенных в Java типов данных.
Способы передачи аргументов методу
Как показывает приведенный выше пример, передача объекта методу производится очень просто. Но в этом примере показаны не все нюансы данного процесса. В некоторых случаях последствия передачи объекта по ссылке будут отличаться от тех результатов, к которым приводит передача значения обычного типа. Для выяснения причин этих отличий рассмотрим два способа передачи аргументов методу.
Первым способом является вызов по значению. В этом случае значение аргумента копируется в формальный параметр метода. Следовательно, изменения, вносимые в параметр метода, не оказывают никакого влияния на аргумент, используемый для вызова. А вторым способом передачи аргумента является вызов по ссылке. В данном случае параметру метода передается ссылка на аргумент, а не значение аргумента. В методе эта ссылка используется для доступа к конкретному аргументу, указываемому при вызове. Это означает, что изменения, вносимые в параметр, будут оказывать влияние на аргу¬
мент, используемый для вызова метода. Как будет показано далее, в Java используются оба способа. А выбор конкретного способа зависит от того, что именно передается.
Если методу передается простой тип, например int или double, он передается по значению. При этом создается копия аргумента, а то, что происходит с параметром, принимающим аргумент, не распространяется за пределы метода. Рассмотрим в качестве примера следующую программу:
// Простые типы данных передаются методам по значению,
class Test {
/* Этот метод не может изменить значения аргументов,
передаваемых ему при вызове. */
void noChange(int i, int j) {
i = i + j;
j = -j;
}
}
class CallByValue {