Встроенные классы в Java Макаревич Л. Г.
Разновидности встроенных классов Вложенные (Nested) классы Внутренние (Inner) классы Локальные классы Анонимные классы Упрощение обработки событий Внимательность Внимательность Аккуратность Аккуратность
class Enclose {static private int a=88; static class Nested { static int i = 55; private int j; Nested(int q){j = q;} static void getI1() { System.out.println("static Nested class, i="+i+a); } void getI2() { System.out.println("Nested class,j="+ j); } Nested n = new Nested(88); static Nested sn = new Nested(99); static void getI1() { System.out.println("static Enclose class, sn.i="+sn.i); } void getI2() { System.out.println("Enclose class, n.j="+ n.j); } class NestedDemo { public static void main(String[] a) { Enclose.getI1(); Enclose ne = new Enclose(); ne.getI2(); Enclose.Nested en = new Enclose.Nested(666); en.getI1();//Enclose.Nested.getI1(); en.getI2(); } Вложенные классы К статическим полям внешнего класса можно обращаться из вложенного, даже если они private К полям вложенного класса можно обращаться из внешнего, даже если они private Создаются 3 класса, какие?
Вложенные интерфейсы Использование в стороннем классе Использование во вложенных классах верхнего уровня
class Encl { A aa = new A(); interface NestedInt { String s = "AAAAA"; void getI(); } static class Q implements NestedInt { public void getI() { System.out.println("StaticQQQQQQQQNested"+ s); } class A implements NestedInt { public void getI() { System.out.println("QQQQQQQQNested"+ s); } class My implements Encl.NestedInt { public void getI() { System.out.println("QQQQQQQQ"+ s); } public static void main(String [] a ) { Encl.Q m = new Encl.Q(); m.getI(); Encl e = new Encl(); e.aa.getI(); e.getI(); }
Внутренние классы public class e1 { private int rrr = 77; static class C//если static, то нельзя обращаться к нестатической rrr { private int i = 88; public int value() {return i /*+rrr*/;} } class D { private String label; D(String w){label = w;} String readLabel() { return label+ rrr;} } public void doIt(String aaa) { C c = new C(); D d = new D(aaa); System.out.println(d.readLabel()); } public static void main(String[] args) { e1 p = new e1(); p.doIt("aaaaaaaaaaaaaaaaa"); e1 p2 = new e1(); } Внутренние классы могут вызывать поля внешнего класса Доступ к элементам классов верхнего уровня
Локальные классы Создавать объект можно только в пределах блока, где локальный класс определен Локальные классы нельзя объявлять с модификатором static Объекты локального класса имеют доступ к: полям класса верхнего уровня final параметрам метода, где определен локальный класс Переменным, объявленным как final К другим переменным метода, содержащего локальный класс, нет доступа
interface D { String readLabel(); } public class e3 { private int y=33; public D dest(final String s) { class PD implements D { private String label; PD(String l ){label = l;} public String readLabel(){return label+y+s;}//без final ошибка } return new PD("qqqqq"); } public static void main(String str[]) { e3 ee = new e3(); D p = ee.dest("QQQQQQQQQQQ"); // здесь PD нельзя System.out.println(p.readLabel()); }
Анонимные классы Используется для одноразового использования объекта на основе класса без имени, если для такого класса не нужен конструктор Вместо конструкторов можно использовать блоки динамической инициализации Процесс создания объекта анонимного класса: Определить интерфейс или абстрактный или простой класс Создать объект по схеме new имя_класса_или_интерфейса { //тело анонимного класса переопределение некоего метода или нескольких }
// анонимный внутренний класс interface D { String readLabel(); } public class e5 { int rrrr = 86759; public D dest(final String str, final int qqq) // без final ошибка { return new D() { public String readLabel() { return label+" " + (rrrr+q);}// public обязательно String label = str; int q; { q = qqq; } };// обязательно ; } public static void main(String str[]) { e5 ee = new e5(); D p = ee.dest("QQQQQQQQQQQ", 1111); System.out.println(p.readLabel()); }
// анонимный внутренний класс interface D { } public class e5 { public static void main(String str[]) { new D(){ void getInfo(){ System.out.println("I am anonymous!"); } }.getInfo(); }