Главная страница

Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


Скачать 1.76 Mb.
НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Дата12.03.2021
Размер1.76 Mb.
Формат файлаdoc
Имя файлаOOP_Lab_Rus.doc
ТипЛабораторная работа
#184105
страница18 из 31
1   ...   14   15   16   17   18   19   20   21   ...   31

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.
1   ...   14   15   16   17   18   19   20   21   ...   31


написать администратору сайта