Не очень понятно про оболочечные Данные,ячейки памяти могут наверно размер менять,какое это значение те же операции только ячейки больше,по скорости тоже самое |
Встроенные классы
11.3. Внутренние (inner) классы
Внутренний класс задается так же, как вложенный, но только без модификатора static перед именем этого класса:
class ИмяВнешнегоКласса{ тело внешнего класса class ИмяВнутреннегоКласса{ тело внутреннего класса } продолжение тела внешнего класса }
Для внутренних классов экземпляры создаются через имя объекта внешнего класса, что принципиально отличает их от обычных и вложенных классов.
Сначала идет создание экземпляра внешнего класса:
ИмяВнешнегоКласса имяОбъекта = new ИмяВнешнегоКласса(параметры);
Затем создается нужное число экземпляров внутреннего класса:
ИмяВнешнегоКласса.ИмяВнутреннегоКласса имя1 = имяОбъекта.new ИмяВнутреннегоКласса(параметры); ИмяВнешнегоКласса.ИмяВнутреннегоКласса имя2 = имяОбъекта.new ИмяВнутреннегоКласса(параметры);
и так далее.
Достаточно часто из внутреннего класса необходимо обратиться к объекту внешнего класса. Такое обращение идет через имя внешнего класса и ссылку this на текущий объект:
ИмяВнешнегоКласса.this
- это ссылка на внешний объект (его естественно назвать родительским объектом). А доступ к полю или методу внешнего объекта в этом случае, естественно, идет так:
ИмяВнешнегоКласса.this.имяПоля ИмяВнешнегоКласса.this.имяМетода(список параметров)
К сожалению, в Java, в отличие от языка JavaScript, нет зарезервированного слова parent для обращения к родительскому объекту. Будем надеяться, что в дальнейшем в java будет введен этот гораздо более читаемый и удобный способ обращения к родителю.
Пример работы с внутренними классами:
package java_gui_example; public class OuterClass { int a=5; public OuterClass() { } public class InnerClass{ int x=1,y=1; public class InnerClass2 { int z=0; InnerClass2(){ System.out.println("InnerClass2 object created"); }; void printParentClassNames(){ System.out.println("InnerClass.this.x="+InnerClass.this.x); System.out.println("OuterClass.this.a="+OuterClass.this.a); } } } InnerClass inner1; InnerClass.InnerClass2 inner2; public void createInner() { inner1=this.new InnerClass(); inner2=inner1.new InnerClass2(); System.out.println("inner1 name="+inner1.getClass().getName()); System.out.println("inner1 canonical name="+ inner1.getClass().getCanonicalName()); } }
Если в приложении задать переменную типа OuterClass и создать соответствующий объект
OuterClass outer1=new OuterClass();
то после этого можно создать объекты внутренних классов:
outer1.createInner();
Доступ к внешним объектам иллюстрируется при вызове метода
outer1.inner2.printParentClassNames();
Заметим, что при создании внутреннего класса в приложении, а не в реализации класса OuterClass, вместо
InnerClass inner1=this.new InnerClass();
и
InnerClass.InnerClass2 inner2= inner1.new InnerClass2();
придется написать
OuterClass.InnerClass inner3=outer1.new InnerClass(); OuterClass.InnerClass.InnerClass2 inner4=inner3.new InnerClass2();
Необходимость во внутренних классах обычно возникает в случаях, когда внешний класс описывает сложную систему, состоящую из частей, каждая из которых, в свою очередь, является системой, очень тесно связанной с внешней. Причем может существовать несколько экземпляров внешних систем. Для такого варианта агрегации идеология внутренних классов подходит очень хорошо.
11.4. Локальные (local) классы
Никаких особенностей в применении локальных классов нет, за исключением того, что область существования их и их экземпляров ограничена тем блоком, в котором они заданы. Пример использования локального класса:
class LocalClass1 { public LocalClass1(){ System.out.println("LocalClass1 object created"); } }; LocalClass1 local1=new LocalClass1();
Этот код можно вставить в любой метод. Например, в обработчик события нажатия на кнопку. Конечно, данный пример чисто иллюстративный.
11.5. Анонимные () классы и обработчики событий
Анонимный (безымянный) класс объявляется без задания имени класса и переменных данного безымянного типа – задается только конструктор класса вместе с его реализацией. У анонимного класса может быть только один экземпляр, причем он создается сразу при объявлении класса. Поэтому перед объявлением анонимного класса следует ставить оператор new. Анонимный класс должен быть наследником какого-либо класса или интерфейса, и соответствующий тип должен быть указан перед списком параметров конструктора.
Синтаксис задания анонимного класса таков:
new ИмяПрародителя(список параметров конструктора) { тело класса }
Как уже говорилось, анонимные классы обычно используют в обработчиках событий, причем сама необходимость в таких классах, по мнению автора, вызвана неудачной организацией в Java работы с обработчиками событий.
Пример использования анонимного класса в "слушателе" события (о них речь пойдет в следующем параграфе):
addMouseMotionListener( new java.awt.event.MouseMotionAdapter(){ public void mouseDragged(java.awt.event.MouseEvent e){ System.out.println("Mouse dragged at: x="+ e.getX()+" y="+e.getY() ); } } );