Может случиться так, что вам нужно будет использовать вложенный класс, просто для того чтобы скрыть его внутри другого класса, а ссылка на объект внешнего класса окажется ненужной. Подавить генерацию этой ссылки можно, объявив вложенный класс статическим(static).
Предположим нам нужно найти в массиве максимальное и минимальное число. Понятно, для этого мы напишем два метода: один для нахождения максимального а второй для минимального числа. При вызове обеих функции массив просматривается дважды. Было бы намного эффективнее просматривать массив только один раз, одновременно определяя и максимальное, и минимальное число.
1 2 3 4 5 6 |
double min = Double.MAX_VALUE; double max = Double.MIN_VALUE; for(double v : values) { if(min > v) min = v; if(max < v) max = v; } |
Однако в таком случае функция должна возвращать два значения. Сделать это можно, определив класс Pair, содержащий два числа:
Не знаете как создать слайд-шоу? Советуем вам полезный урок по созданию слайд-шоу. Все очень легко и просто.
1 2 3 4 5 6 7 8 9 10 |
class Pair { public Pair(double f, double s) { first = f; second = s; } public double getFirst() {return first;} public double getSecond() {return second;} private double first; private double second; } |
Тогда метод minimax сможет вернуть объект класса Pair:
1 2 3 4 5 6 |
class ArrayAlg { public static Pair minmax(double[] values) { ..... return new Pair(min,max); } } |
Вызывающий метод использует для получения минимального и максимального значения методы getFirst() и getSecond():
1 2 3 |
Pair p = ArrayAlg.minmax(d); System.out.println("min = " + p.getFirst()); System.out.println("max = " + p.getSecond()); |
Разумеется имя Pair слишком широко распространено, и при выполнении большого проекта у другого программиста может возникнуть такая же блестящая идея, вот только класс Pair у него будет содержать не числа, а строки. Эту потенциальную проблему можно решить, сделав класс Pair вложенным классов, определяемым внутри ArrayAlg. Тогда настоящим именем класса будет не Pair а ArrayAlg.Pair:
1 |
ArrayAlg.Pair p = ArrayAlg.minmax(d); |
Однако в отличие от вложенных классов, использованных в предыдущих примерах, ссылка на другой объект внутри класса Pair не нужна. Ее можно подавить, объявив вложенный класс статическим:
1 2 3 4 5 6 7 |
class ArrayAlg { public static class Pair { ..... } ..... } |
Разумеется, только вложенные классы можно объявлять статическими. Статический вложенный класс ничем не отличается от любого другого внутреннего класса, за исключением того, что его объект не содержит ссылку на создавший его объект внешнего класса. В нашем примере следует применять статический вложенный класс, поскольку объект внутреннего класс создается внутри статического метода.
1 2 3 4 |
public static Pair minmax(double[] d) { ..... return new Pair(min,max); } |
Если бы класс Pair не был объявлен статическим, компилятор сообщил бы о том, что при инициализации объекта внутреннего класса объект типа ArrayAlg не доступен.
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 |
public class staticInnerClass { public static void main(String[] args) { double[] d = new double[20]; for(int i = 0; i < d.length; i++) d[i] = 100 * Math.random(); ArrayAlg.Pair p = ArrayAlg.minmax(d); System.out.println("min = " + p.getFirst()); System.out.println("max = " + p.getSecond()); } } class ArrayAlg { public static class Pair { public Pair(double f, double s) { first = f; second = s; } public double getFirst() { return first; } public double getSecond() { return second; } private double first; private double second; } public static Pair minmax(double[] values) { double min = Double.MAX_VALUE; double max = Double.MIN_VALUE; for(double v : values) { if(min > v) min = v; if(max < v) max = v; } return new Pair(min,max); } } |