Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
for (int i=l; i < r^urns. length; i++)
if(nums[i] > m) m = nums[i];
return m;
}
int avg() {
int a = 0;
for(int i=0; i < nums.length; i++)
a += nums[i];
return a / nums.length;
}
}
}
class NestedClassDemo {
public static void main(String args[]) {
int x[] = { 3, 2, 1, 5, 6, 9, 7, 8 };
Outer outOb = new Outer(x);
outOb.Analyze();
}
}
Результат выполнения данной программы выглядит следующим образом:
Minimum: 1
Maximum: 9
Average: 5
В данном примере внутренний класс Inner обрабатывает массив nums, являющийся членом класса Outer. Как упоминалось выше, вложенный класс имеет доступ к членам объемлющего класса, и поэтому он может непосредственно обращаться к массиву nums. А вот обратное не справедливо. Так, например, метод analyze () не может непосредственно вызвать метод min (), не создав объект типа Inner.
Как упоминалось выше, класс можно вложить в области действия блока. В итоге получается локальный класс, недоступный за пределами блока. В следующем примере программы класс ShowBits, созданный в примере для опробования 5.3, преобразуется таким образом, чтобы стать локальным.
// Применение класса ShowBits в качестве локального,
public static void main(String args[]) {
class LocalClassDemo {
// Внутренний вариант класса ShowBits.
// Локальный класс, вложенный в метод.
class ShowBits {
int numbits;
ShowBits(int n) {
numbits = n;
}
void show(long val) {
long mask = 1;
// сдвинуть влево для установки единицы в нужной позиции
mask <<= numbits-1;
int spacer = 0;
for(; mask != 0; mask >»= 1) {
if((val & mask) != 0) System.out.print("1");
else System, out .pri-nt ("0") ;
spacer++;
if((spacer % 8) ==0) {
System.out.print(" ");
spacer = 0;
}
}
System.out.println() ;
}
}
for(byte b = 0; b < 10; b++) {
ShowBits byteval = new ShowBits(8);
System.out.print(b + " in binary: ");
byteval.show(b);
}
}
}
Выполнение этой программы дает следующий результат:
0 in binary: 00000000
1 in binary: 00000001
2 in binary: 00000010
3 in binary: 00000011
4 in binary: 00000100
5 in binary: 00000101
6 in binary: 00000110
7 in binary: 00000111
8 in binary: 00001000
9 in binary: 00001001
В данном примере класс ShowBits недоступен за пределами метода main (), а следовательно, попытка получить доступ к нему из любого метода, кроме main (), приведет к ошибке.
И последнее замечание: внутренний класс может быть безымянным. Экземпляр безымянного, или анонимного, внутреннего класса создается при объявлении класса с помощью оператора new. Безымянные внутренние классы будут подробнее рассмотрены в главе 15.
Аргументы переменной длины
Иногда оказываются полезными методы, способные принимать переменное число аргументов. Например, методу, устанавливающему соединение с Интернетом, могут понадобиться имя и пароль пользователя, имя файла, протокол и другие параметры. Если при вызове метода какие-нибудь из этих данных не указаны, то должны использоваться значения по умолчанию. В таком случае было бы уместнее передавать только те аргументы, для которых не предусмотрены значения по умолчанию. А для этого требуется метод, поддерживающий список аргументов переменной, не фиксированной длины.