Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.

Podobné prezentace


Prezentace na téma: "PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá."— Transkript prezentace:

1 PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy X, X$Y a X$Y$Z. Z vidí členy všech obalů – nedbá na jejich modifikátory přístupu. Hlavičky umožňuji uvést extends resp. implements i generiku. [ public | protected | private ] [ strictfp ] - [ static ] [ abstract ] interface - nested interfejs, neb je vždy static - static [ abstract | final ] class - nested třída - [ abstract | final ] class - inner třída - lokální: bez modifikátorů přístupu - anonymní: bez hlavičky Nested člen má přístup jen ke static členům svých obalů. Může mít statické i nestatické členy. Inner třídy nejsou static a kromě static final konstant nemohou deklarovat žádné statické členy - mohou je však zdědit.

2 PJV15 2 Lokální třída je vnitřní třída deklarovaná v kódovém bloku. -jen s modifikátory [ strictfp ] [ abstract | final ] -typ lokální třídy je známý v bloku až za její deklarací. -lze ji instanciovat pouze z vnitřku metody - není přístupná zvnějšku. -má přístup jen k finálním lokálním proměnným resp. finálním parametrům metody či konstruktoru – to proto, aby je nešlo měnit z lokální třídy. ( Finální lokální proměnné se tak stávají dodatečnými parametry. ) -sice return umožňuje objekt vrátit, avšak jeho vlastní typ není vně znám, neb v hlavičce metody nelze zadat jméno lokální třídy jako návratový typ. Lokální třída získá jméno s prefixem ze jmen vnějších tříd a pořadovým číslem metody $n v níž jsou deklarovány stejnojmenné lokální třídy. Tento typ, např. Out$3Loc, je vně neznámý, tudíž nelze jím přetypovat. Lze užít vně známých typů, které lokální třída rozšiřuje či implementuje. Lokální interfejs není možný - vnitřní interfejsy neexistují.

3 PJV15 3 Anonymní třída je lokální třída bez hlavičky avšak : nemá jméno, modifikátory ani nelze použít extends či implements, nemůže mít potomky ani explicitní konstruktory, má jen bezejmenný defaultní konstruktor, roli konstruktorů nahrazují nestatické inicializátory, zkompilovaná třída má jméno sestavené dle obalů a ukončené $i, i>=1, lze vytvořit podle ní jen jeden objekt. Například: TX x = new T(…) { // T je třída či interfejs // TX je T či jeho nadtyp či Object... // nestatické členy... // jen statické finální atributy { … } // nestatický inicializátor }; Hojně se využívá v listenerech pro odchyt událostí v awt/swing,

4 PJV15 4 Adapter je obecně třída, implementující nějaký interfejs tak, že zděděné abstraktní metody přepíše na konkrétní - avšak prázdné. Adapter mívá triviální funkcionalitu a bývá s modifikátorem abstract. Slouží totiž jako předek potomkům, kteří mají některé metody přepsány na neprázdné, čímž s žádanou funkcionalitou - aniž programátor musí psát prázdné, nepotřebné metody. Např.: interface java.awt.WindowListener má sedm metod. Adapter definovaný takto: abstract class WindowAdapter implements WindowListener je všechny metody konkretizuje prázdnými metodami. Ovládat okénko ikonou lze pomocí tzv. handleru, což je objekt vytvořený buď dle normální anebo anonymní třídy. Důležité je, že v obou případech je splněn interfejs WindowListener.

5 PJV15 5 Použití adapteru Pojmenovaně: WindowListener wl = new WindowHandler( ); kde: class WindowHandler extends WindowAdapter { public void WindowClosing( WindowEvent ev ) { System.exit(0); // end of application } či anonymně: WindowListener wl = new WindowAdapter( ) { public void WindowClosing( WindowEvent ev ) { System.exit(0); // end of application } };

6 PJV15 6 Inner class Vnitřní třída umožňuje seskupit věcně související kódy a případně je skrýt. public class Outer { private int x; public class Inner { public void m( ) { x++; } } public void test( ) { Inner n = new Inner( ); n.m( ); } public static void main(... ) { Outer o = new Outer( ); o.test( ); } main( test( m( this n Outer Inner Outer.this stackheap o x

7 PJV15 7 Inner class public class Outer { private int x; public class Inner { public void m( ) { x++; } } public class OuterTest { public static void main(... ) { Outer p = new Outer( ); Outer.Inner n = p.new Inner( ); // n = new Outer( ). new Inner( ); n.m( ); } main( m( p n this Outer Inner x Outer.this stackheap Instanciovat Inner lze jen prostřednictvím instance Outer.

8 PJV15 8 Inner class public class Outer { private int x; public class Inner { private int x; public void m( int x ) { x++; this.x++; Outer.this.x++; } public static void main(... ) { Outer p = new Outer( ); Outer.Inner n = p.new Inner(); n.m( ); } main( m( x n x Outer Inner x Outer.this x this stack heap

9 PJV15 9 Local class public class Outer { private int x = 5; public Object get( final int y ) { final int z = 6; class Local { public String toString ( ) { return ""+(x+y+z); } } return new Local( ); } public static void main( String [ ] args ) { Outer p = new Outer( ); Object obj = p.get( 700 ); System.out.println( obj ); // vytiskne 711 }

10 PJV15 10 Využití vnořených tříd Bod, úsečku, obdélník, elipsu atd. v rovině pojednávají balíčky java.awt s přesností int a java.awt.geom s přesností double a float abstract class Point2D { // nedeklaruje atributy static class Point2D.Float extends Point2D { float x, y;... get } static class Point2D.Double extends Point2D { double x, y;... get } public double distance( Point2D pt ) { return … } public abstract double getX( ); … // getry a setry } class Point extends Point2D { int x, y; public double getX( ) {…} … } Od třídy Point2D dědí ostatní metody distance, distanceSq a další. Díky polymorfismu lze: Point2D p1 = new Point2D.Double( 1.1, 2.2 ); Point p2 = new Point( 3, 4 ); double d = p1.distance( p2 );


Stáhnout ppt "PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá."

Podobné prezentace


Reklamy Google