Вложенные (nested) классы




Вложенный класс логически связан с классом-владельцем, но может быть использован независимо от него. При объявлении такого внутреннего класса присутствует служебное слово static, и такой класс называется вложенным (nested). Если класс вложен в ин-терфейс, то он становится статическим по умолчанию. Такой класс способен наследовать другие классы, реализовывать интерфейсы и являться объектом наследования для любого класса, обладающего необходимыми правами доступа. В то же время статический вложенный класс для доступа к нестатическим членам и методам внешнего класса должен создавать объект внешнего класса, а напрямую имеет доступ только к статическим полям и методам внешнего класса. Для создания объекта вложенного класса объект внешнего класса создавать нет необходимости. Подкласс вложенного класса не способен унаследовать возможность доступа к членам внешнего класса, которыми наделен его суперкласс.

/* пример # 13: вложенный класс: Ship.java: RunnerShip.java */

package chapt06;

public class Ship {

private int id;

// abstract, final, private, protected - допустимы

public static class LifeBoat {

public static void down() {

System.out.println("шлюпки на воду!"); }

public void swim() {

System.out.println("отплытие шлюпки"); } } }

package chapt06;

public class RunnerShip {

public static void main(String[] args) {

// вызов статического метода

Ship.LifeBoat.down();

// создание объекта статического класса

Ship.LifeBoat lf = new Ship.LifeBoat();

// вызов обычного метода

lf.swim(); } }

Статический метод вложенного класса вызывается при указании полного относительного пути к нему. Класс, вложенный в интерфейс, по умолчанию статический. На него не накладывается никаких особых ограничений, и он может содержать поля и методы как статические, так и нестатические.

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

Анонимные классы эффективно используются, как правило, для реализации

(переопределения) нескольких методов и создания собственных методов объекта.

Конструкторы анонимных классов нельзя определять и переопределять. Анонимные классы допускают вложенность друг в друга, что может сильно запутать код и сделать эти конструкции непонятными.

/* пример # 15: анонимные классы: TypeQuest.java: RunnerAnonym.java */

package chapt06;

public class TypeQuest {

private int id = 1;

public TypeQuest() {

}

public TypeQuest(int id) {

this.id = id;

}

public void addNewType() {

// реализация

System.out.println(

"добавлен вопрос на соответствие"); } }

 

package chapt06;

public class RunnerAnonym {

public static void main(String[] args) {

TypeQuest unique = new TypeQuest() {// анонимный класс #1

public void addNewType() {

// новая реализация метода

System.out.println(

"добавлен вопрос со свободным ответом"); }

};// конец объявления анонимного класса

unique.addNewType();

new TypeQuest(71) {// анонимный класс #2

private String name = "Drag&Drop";

public void addNewType() {

// новая реализация метода #2

System.out.println("добавлен " + getName());

}

String getName() {

return name;

}

}.addNewType();

 

TypeQuest standard = new TypeQuest(35);

standard.addNewType(); } }

 

Класс String

Каждая строка, создаваемая с помощью оператора new или с помощью литерала (заключённая в двойные апострофы), является объектом класса String. Особенностью объекта класса S tring является то, что его значение не может быть изменено после создания объекта при помощи какого-либо метода класса, так как любое изменение строки приводит к созданию нового объекта. При этом ссылку на объект класса String можно изменить так, чтобы она указывала на другой объект и тем самым на другое значение. Класс String поддерживает несколько конструкторов, например:

String(), String(String str), String(byte asciichar[]),

String(char[] unicodechar), String(StringBuffer sbuf),

String(StringBuilder sbuild) и др.

Класс String содержит следующие методы для работы со строками:

String concat(String s) или “+” – слияние строк;

boolean equals(Object ob) и equalsIgnoreCase(String s) – сравнение строк с учетом и без учета регистра соответственно;

int compareTo(String s) и compareToIgnoreCase(String s) – лексикографическое сравнение строк с учетом и без учета регистра. Метод возвращает значение нуль в случае, когда equals() возвращает значение t rue;

boolean contentEquals(StringBuffer ob) – сравнение строки и содержимого объекта типа StringBuffer;

String substring(int n, int m) – извлечение из строки подстроки длины m-n, начиная с позиции n. Нумерация символов в строке начинается с нуля;

String substring(int n) – извлечение из строки подстроки, начиная с позиции n;

int length() – определение длины строки;

int indexOf(char ch) – определение позиции символа в строке;

static String valueOf(значение) – преобразование переменной базового типа к строке;

String toUpperCase()/toLowerCase() – преобразование всех символов вызывающей строки в верхний/нижний регистр;

String replace(char с1, char с2) – замена в строке всех вхождений первого символа вторым символом;

String intern() – заносит строку в “пул” литералов и возвращает ее объектную ссылку;

String trim() – удаление всех пробелов в начале и конце строки;

char charAt(int position) – возвращение символа из указанной позиции (нумерация с нуля);

boolean isEmpty() – возвращает true, если длина строки равна 0;

static String format(String format, Object... args), format(Locale l, String format, Object... args) – генерирует форматированную строку, полученную с использованием формата, интернационализации и др.;

String[] split(String regex), split(String regex, int limit) – поиск вхождения в строку заданного регулярного выражения (разделителя) и деление исходной строки в соответствии с этим на массив строк.

Во всех случаях вызова методов, изменяющих строку, создается новый объект типа String

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: