Статические вложенные классы

Статические вложенные классыМожет случиться так, что вам нужно будет использовать вложенный класс, просто для того чтобы скрыть его внутри другого класса, а ссылка на объект внешнего класса окажется ненужной. Подавить генерацию этой ссылки можно, объявив  вложенный класс статическим(static).

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

Однако в таком случае функция должна возвращать два значения. Сделать это можно, определив класс Pair, содержащий два числа:

Не знаете как создать слайд-шоу? Советуем вам полезный урок по созданию слайд-шоу. Все очень легко и просто.

Тогда метод minimax сможет вернуть объект класса Pair:

Вызывающий метод использует для получения минимального и максимального значения методы getFirst() и getSecond():

Разумеется имя Pair слишком широко распространено, и при выполнении большого проекта у другого программиста может возникнуть такая же блестящая идея, вот только класс Pair у него будет содержать не числа, а строки. Эту потенциальную проблему можно решить, сделав класс Pair вложенным классов, определяемым внутри ArrayAlg. Тогда настоящим именем класса будет не Pair а ArrayAlg.Pair:

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

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

Если бы класс Pair не был объявлен статическим, компилятор сообщил бы о том, что при инициализации объекта внутреннего класса объект типа ArrayAlg не доступен.