Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 7. Методы и классы 1_83

Вывод этой программы:

В методе display: outer_x = 100

В этой программе внутренний класс с именем inner определен в пределах области видимости класса outer. Поэтому любой код в классе inner может прямо обращаться к переменной outer_x. Внутри 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 у = 10; // у — локальная для Inner

void display!) {

System.out.println("В методе display: outer_x = " + outer_x);

i

}

void showy() {

System.out.println(y); //ошибка, у здесь неизвестна! ) }

class InnerClassDemo {

public static, void main (String args[]) {

184 '• Часть I. Язык Java

Outer outer = new Outer(); outer.test(); } }

Здесь у объявлена как переменная экземпляра класса 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 InnerClassDemo {

public static void main(String args[]) ( Outer outer = new Outeri); 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

Глава 7. Методы и классы . 185

В методе display: outer_x = 100 В методе display: outer_x = 100 В методе display: outer_x = 100

В то время как вложенные классы почти не используются в повседневном программировании, они особенно .полезны при обработке событий в аппле-тах. Мы вернемся к теме вложенных классов в главе 20. Там вы увидите, как можно использовать внутренние классы, чтобы упростить код, необходимый для обработки некоторых типов событий. Вы изучите также анонимные внутренние классы, являющиеся внутренними, которые не имеют имен.

i ^ , ' •

И последнее замечание: в оригинальной спецификации Java 1.0 вложенные классы не допускались. Они были добавлены в Java 1.1.

Класс String

Хотя класс string будет подробно рассмотрен в Части II этой книги, крат­кое его рассмотрение необходимо уже теперь, потому что в некоторых при­мерах программ, показанных в конце Части I, мы будем использовать стро­ки, string — это, пожалуй, чаще всего используемый класс в библиотеке классов Java. Причина очевидна — строки являются очень важной частью программирования.

Для начала важно понять, что каждая строка, которую вы создаете, в дейст­вительности является объектом типа string. Даже строчные константы — это фактически string-объекты. Например, в утверждении

System.out.println("This is a String, too");

строка "This is a String, too" является string-константой. К счастью, Java об­рабатывает string-константы так же, как другие машинные языки обраба­тывают "нормальные" строки, так что вас это не должно беспокоить.

Кроме того, нужно понять, что объекты типа string неизменяемы. Если string-объект создан, то его содержимое не может быть изменено. Хотя данное утверждение похоже на серьезное ограничение, однако это не так по двум причинам:

О если нужно изменить строку, то всегда можно создать ее новую модифи­цированную копию;

П Java определяет класс просмотра (peer class) для string, называемый stringBuffer, который позволяет строкам стать изменяемыми, так что все нормальные манипуляции со строками все еще доступны в Java. (stringBuffer описан в Части II этой книги.)

Строки можно создать множеством способов. Самый простой — с помощью следующего утверждения:

String myString = "Это тест";

186 Часть I. Язык Java

Как только вы создали string-объект, то можете использовать его везде, где допустима строка. Например, следующее утверждение выводит myst ring-объект на экран дисплея:

System.out.println(myString);

Java определяет одну операцию для string-объектов, которая обозначается знаком плюс (+). Она используется для сцепления (конкатенации) двух строк. Например, такой оператор:

String myString = "Мне"'+ " нравится программировать на " + "Java.";

приводит к следующему содержимому объекта myString: "Мне нравится программировать на Java".

Предыдущие концепции демонстрирует следующая программа:

// Демонстрация строк, class StringDemo {

public static void main(String args[]) {

String strObl = "Первая строка";

String strOb2 = "Вторая строка";

String strObS = strObl + " и " + Str0b2;

System.out.println(strObl); System.out.println(strOb2); System.out.println(strObS); } }

Вывод, выполняемый этой программой:

Первая трока

Вторая строка

Первая строка и Вторая строка

Класс string содержит несколько полезных методов. Используя equals о, можно проверять две строки на равенство. Длину строки можно получить, вызывая метод lengtho. Вызывая charAto, можно получить символ строки с указанным индексом (номером). Общие формы из этих трех методов:

boolean equals(String object)

int length()

char charAt(int index)

Ниже приведена программа, которая демонстрирует эти методы:

// Демонстрация некоторых методов класса String, class StringDemo2 {

public static void main(String args(]) (

Соседние файлы в папке JavaLit