Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Программирование сдал




Внутренний класс определяет сущность предметной области “результат экзамена” (класс ExamResult), которая обычно непосредственно связана в информационной системе с объектом класса Student. Класс ExamResult в данном случае определяет только методы доступа к своим атрибутам и совершенно невидим вне класса Student, который включает методы по созданию и инициализации массива объектов внутреннего класса с любым количеством экзаменов, который однозначно идентифицирует текущую успеваемость студента.

Внутренний класс может быть объявлен также внутри метода или логичес­кого блока внешнего класса. Видимость такого класса регулируется областью видимости блока, в котором он объявлен. Но внутренний класс сохраняет доступ ко всем полям и методам внешнего класса, а также ко всем константам, объявленным в текущем блоке кода. Класс, объявленный внутри метода, не может быть объявлен как static, а также не может содержать статические поля и методы.

/*пример # 12: внутренний класс, объявленный внутри метода: TeacherLogic.java*/

package chapt06;

 

public abstract class AbstractTeacher {

private int id;

public AbstractTeacher(int id) {

this. id = id;

}

public abstract boolean excludeStudent(String name);

}

package chapt06;

 

public class Teacher extends AbstractTeacher {

 

public Teacher(int id) {

super (id);

}

public boolean excludeStudent(String name) {

return false;

}

}

package chapt06;

 

public class TeacherCreator {

public TeacherCreator(){}

 

public AbstractTeacher createTeacher(int id) {

// объявление класса внутри метода

class Dean extends AbstractTeacher {

Dean(int id){

super (id);

}

public boolean excludeStudent(String name) {

if (name!= null) {

// изменение статуса студента в базе данных

return true;

}

else return false;

}

} // конец внутреннего класса

 

if (isDeanId (id))

return new Dean(id);

else return new Teacher(id);

}

private static boolean isDeanId(int id) {

// проверка декана из БД или

return (id == 777);

}

}

package chapt06;

 

public class TeacherLogic {

public static void excludeProcess(int deanId,

String name) {

AbstractTeacher teacher =

new TeacherCreator().createTeacher(deanId);

 

System. out. println("Студент: " + name

+ " отчислен:" + teacher.excludeStudent(name));

}

public static void main(String[] args) {

excludeProcess (700, "Балаганов");

excludeProcess (777, "Балаганов");

}

}

В результате будет выведено:

Студент: Балаганов отчислен:false

Студент: Балаганов отчислен:true

Класс Dean объявлен в методе createTeacher(int id), и соответственно объекты этого класса можно создавать только внутри этого метода, из любого другого места внешнего класса внутренний класс недоступен. Однако существует возможность получить ссылку на класс, объявленный внутри метода, и использовать его специфические свойства. При компиляции данного кода с внутренним классом ассоциируется объектный модуль со сложным именем
TeacherCreator$1Dean, тем не менее однозначно определяющим связь между внешним и внутренним классами. Цифра 1 в имени говорит о том, что в других методах класса могут быть объявлены внутренние классы с таким же именем.

Вложенные (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();

}

}

Статический метод вложенного класса вызывается при указании полного относительного пути к нему. Объект lf вложенного класса создается с использованием имени внешнего класса без вызова его конструктора.

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

/* пример # 14: класс вложенный в интерфейс: Faculty.java: University.java */

package chapt06;

 

public interface University {

int NUMBER_FACULTY = 20;

 

class LearningDepartment { // static по умолчанию

public int idChief;

 

public static void assignPlan(int idFaculty) {

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

}

public void acceptProgram() {

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

}

}

}

Такой внутренний класс использует пространство имен интерфейса.

Анонимные (anonymous) классы

Анонимные (безымянные) классы применяются для придания уникальной функциональности отдельно взятому объекту для обработки событий, реализации блоков прослушивания и т.д. Можно объявить анонимный класс, который будет расширять другой класс или реализовывать интерфейс при объявлении одного, единственного объекта, когда остальным объектам этого класса будет соответствовать реализация метода, определенная в самом классе. Объявление анонимного класса выполняется одновременно с созданием его объекта посредством оператора 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();

}

}

В результате будет выведено:






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных