Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
5.6 Ревизия массивовМассивы были представлены в этой книге раньше, чем были рассмотрены классы. Теперь, когда известны классы, для массивов можно сделать одно важное обобщение: их можно реализовать в форме объектов. В связи с этим имеется специальный атрибут массива, преимуществом которого вы, вероятно, захотите воспользоваться. Речь идет об экземплярной переменной length, которая определяет размер (длину) массива, т.е. число элементов, содержащихся в нем. Все массивы-объекты имеют эту переменную, и она всегда содержит размер массива. Следующая программа демонстрирует указанное свойство: // Эта программа демонстрирует элемент длины массива. class Length { public static void main(String args[]) { int a1[] = new int[10]; int a2[] = {3, 5, 7, 1, 8, 99, 44, -10}; int a3[] = {4, 3, 2, 1}; System.out.println("Размер a1 равен " + a1.length); System.out.println("Размер a2 равен " + a2.length); System.out.println("Размер a3 равен " + a3.length); } } Эта программа отображает (на экран) следующий вывод: Размер a1 равен 10 Размер a2 равен 8 Размер a3 равен 4 Здесь видно, что отображается размер каждого массива. Имейте в виду, что значение length не имеет никакого отношения к числу элементов, которые фактически используются. Она отражает только число элементов, на которое массив рассчитан. 5.7 Вложенные и внутренние классыСуществует возможность определения одного класса внутри другого. Такие классы известны как вложенные (nested) классы. Область видимости вложенного класса ограничивается областью видимости включающего класса. Таким образом, если класс B определен в классе A, то B известен внутри A, но не вне его. Вложенный класс имеет доступ к членам класса (включая private-члены), в который он вложен. Однако включающий класс не имеет доступа к членам вложенного класса. Существует два типа вложенных классов: статические и нестатические. Статический вложенный класс — это класс, который имеет модификатор static. Согласно своей характеристике он должен обращаться к членам своего включающего класса через объект. То есть он не может обратиться к членам включающего класса напрямую. Из-за этого ограничения статические вложенные классы используются редко. Наиболее важный тип вложенного класса — внутренний (inner) класс. Внутренний класс – это нестатический вложенный класс, имеющий доступ ко всем переменным и методам своего внешнего класса и возможность обращаться к ним напрямую, таким же способом, как это делают другие нестатические члены внешнего класса. Итак, внутренний класс находится полностью в пределах видимости своего включающего класса. Следующая программа показывает, как можно определять и использовать внутренний класс. Класс с именем Outer имеет одну переменную экземпляра с именем outer_x, один метод экземпляра с именем test() и определяет один внутренний класс с именем inner. // Демонстрирует внутренний класс. class Outer { int outer_x = 100; void test () { Inner inner = new Inner(); inner.display(); } // это внутренний класс class Inner { void display() { System.out.println("В методе display: outer_x = " + outer_x); } } } class InnerClassDemo { public static void main(String args[]) { Outer outer = new Outer(); outer.test(); } } Вывод этой программы: В методе display: outer_x = 100 В этой программе внутренний класс с именем inner определен в пределах области видимости класса outer. Поэтому любой код в классе inner может прямо обращаться к переменной outer. Внутри inner определен экземп-лярный метод с именем display(). Этот метод отображает outer_x в поток стандартного вывода. Метод main() класса InnerCiassDemo создает экземпляр (объект) класса outer и вызывает его метод test(). Тот метод создает экземпляр класса inner и вызывает метод display(). Важно понять, что класс inner известен только в пределах области действия (т.е. внутри) класса outer. Java-компилятор генерирует сообщение об ошибке, если какой-то код вне класса outer делает попытку создать экземпляр (объект) класса inner. Итак, вложенный класс ничем не отличается от любого другого программного элемента, но он известен только в пределах включающей его области. Внутренний класс имеет доступ ко всем членам своего включающего класса, но обратное – не верно. Члены внутреннего класса известны только в пределах внутреннего класса и не могут использоваться внешним классом. Например: // Эта программа компилироваться не будет. class Outer { int outer_x = 100; void test() { Inner inner = new Inner(); inner.display(); } // это внутренний класс class Inner { int y = 10; // y - локальная для Inner void display() { System.out.println("В методе display: outer_x = " + outer_x); } } void showy() { System.out.println(y); //ошибка, у здесь неизвестна! } } class InnerClassDemo2 { public static void main(String args[]) { Outer outer = new Outer(); outer.test (); } } Здесь y объявлена как переменная экземпляра класса inner. Таким образом, она не известна вне этого класса, и не может использоваться методом showy(). Хотя мы сосредоточились на вложенных классах, объявленных в области внешнего класса, существует возможность определять внутренние классы в пределах любого блока. Например, можно определить вложенный класс в блоке, установленном в методе или даже в теле цикла for, как показывает следующая программа. // Определение внутреннего класса в цикле for. class Outer { int outer_x = 100; void test() { for(int i=0; i<10; i++) { class Inner { void display() { System.out.println("В методе display: outer_x = " + outer_x); } } Inner inner = new Inner(); inner.display(); } } } class InnerClassDemo3 ( public static void main(String args[]) { Outer outer = new Outer(); outer.test (); } } Вывод этой версии программы: В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100 В то время как вложенные классы почти не используются в повседневном программировании, они особенно полезны при обработке событий в апплетах. В оригинальной спецификации Java 1.0 вложенные классы не допускались. Они были добавлены в Java 1.1. |