250 likes | 453 Views
OCPJP. Inner classes. Wprowadzone w Java ?.?. i nner classes method-local inner classes a nonymous inner classes s tatic nested classes. Inner classes. class BabaJaga { class WszystkieDzieciZjada { } } javac BabaJaga.java Jakie pliki utworzą się na dysku?. BabaJaga.class
E N D
OCPJP Innerclasses
Wprowadzone w Java ?.? • innerclasses • method-localinnerclasses • anonymousinnerclasses • staticnestedclasses
Innerclasses classBabaJaga { classWszystkieDzieciZjada { } } javacBabaJaga.java Jakie pliki utworzą się na dysku?
BabaJaga.class BabaJaga$WszystkieDzieciZjada.class
Czy tak skompilowany program można uruchomić poleceniem:javaZlowrogiDelfin$MalyZlowrogiDelfin? classZlowrogiDelfin { classMalyZlowrogiDelfin { staticvoidmain(String[] args) { System.out.println( „NIE dla delfinariów!”); } } }
public classPakero { privateintobwodKabla = 50; public Stringodzywka = „Koks”; classDanePakera { public voidileMaWKablu() { out.println(„Obwod kabla: ” + obwodKabla); } publicvoidjakaMaOdzywke() { out.println(„Odżywka: ” + odzywka); } } publicvoidcalaPrawdaOPakerze() { DanePakeradp = newDanePakera(); dp.ileMaWKablu(); dp.jakaMaOdzywke(); } }
public voidstaticmain(String[] args) { newPakero().newDanePakera().ileMaWKablu(); Pakero.DanePakeradp = newPakero() .newDanePakera() .jakaMaOdzywke(); }
class Smerfetka { classSekretSmerfetki { voidsekretPierwszy { out.println(„Osiłek issoocool..”); } } staticvoidzdradzSekret() { SekretSmerfetkiss = newSekretSmerfetki(); ss.sekretPierwszy(); } } publicvoidmain(String[] args) { Smerfetka.zdradzSekret(); }
classTieto { intzysk = 1_000_000; intkierownicy = 20; intpracownicy = 700; booleankryzys = true; booleanzarzadZadowolonyZZysku = false; booleankierownikZadowolonyZPracownika = false; booleankoniunkcjaMarsJowisz = false; intprocentZysku(int p) { return p * zysk / 100; } classZarzad { int zysk = 950_000; intpensja() { returnprocentZysku(80); } classKierownicy { intpensja() { returnprocentZysku(15); } classPracownicy { intpensja() { returnzysk - Zarzad.this.pensja() - Kierownicy.this.pensja(); } int pensja1() { returnZarzad.Kierownicy.Pracownicy.this.pensja(); } int pensja2() { returnKierownicy.Pracownicy.this.pensja(); } intmojaPensja() { returnpensja() / pracownicy; } intmojaPremia() { if(!kryzys && zarzadZadowolonyZZysku && kierownikZadowolonyZPracownika && koniunkcjaMarsJowisz) return100 / pracownicy; else return 0; } } } } }
class A { privateint m; public void g() { A$Bob = newA$B(); ob.f(); m = ob.access$0() * ob.access$1(); } int access$0 { return m; } } class A { privateint m; privateclass B { privateint x; privateint y; void f() { x = m; } } public void g() { B ob = new B(); ob.f(); m = ob.x * ob.y; } } classA$B { A this$0; privateint x; void f() { x = this$0.access$0(); } int access$0 { return x; } int access$1 { return y; } }
Modyfikatory • final • abstract • public • private • protected • static * • strictfp
Method-LocalInnerClasses classNaszaKlasa { intuzytkownikow; void statystyka { class Statystyka { int kobiet; intmezczyzn; } Statystyka s = new Statystyka(); println(„kobiet: ” + s.kobiet + „/” + uzytkownikow); println(„mezczyzn: ” + s.mezczyzn + „/” + uzytkownikow); } }
class Warzywniak { StringgodzinyOtwarcia() { finalString nazwa = "Warzywko u Stasia"; classGodzinyOtwarcia { StringutworzListe() { class Godzina { Godzina(String d, int go, intgd) { dzien = d; godzOd = go; godzDo = gd; } Stringdzien; intgodzOd; intgodzDo; publicStringtoString() { returndzien + „:” + godzOd + " - " + godzDo + "\n"; } } return "Godziny otwarcia sklepu: " + nazwa + "\n" + new Godzina("Poniedzialek", 10, 18) + new Godzina("Sroda", 9, 17) + new Godzina("Sobota", 10, 15); } } GodzinyOtwarcia godziny = newGodzinyOtwarcia(); returngodziny.utworzListe(); } } System.out.println(new Warzywniak().godzinyOtwarcia());
class Warzywniak { StringgodzinyOtwarcia() { finalString nazwa = "Warzywko u Stasia"; classGodzinyOtwarcia { +privateString nazwa; +GodzinyOtwarcia(String nazwa) { this.nazwa = nazwa; } StringutworzListe() { class Godzina { Godzina(String d, int go, intgd) { dzien = d; godzOd = go; godzDo = gd; } Stringdzien; intgodzOd; intgodzDo; publicStringtoString() { returndzien + „:” + godzOd + " - " + godzDo + "\n"; } } return "Godziny otwarcia sklepu: " + nazwa + "\n" + new Godzina("Poniedzialek", 10, 18) + new Godzina("Sroda", 9, 17) + new Godzina("Sobota", 10, 15); } } +GodzinyOtwarcia godziny = newGodzinyOtwarcia(nazwa); returngodziny.utworzListe(); } }
Modyfikatory • final • abstract • public • private • protected • static * • strictfp
AnonymousInnerClass classPomidorowa { publicvoidzamieszaj() {} } classOgorkowa { publicvoidzamieszaj() {} } classZupy { privatePomidorowa p = newPomidorowa(); privateOgorkowa o = newOgorkowa() { publicvoidzamieszaj() {} }; }
classOgorkowa { publicvoidzamieszaj() {} } classZupy { privateOgorkowa o = newOgorkowa() { publicvoidzamieszaj() {} publicvoidodcedz() {} }; voidgotuj() { o.zamieszaj(); o.odcedz(); } }
interfaceZupa { voidskladniki(); } abstractclassRosolimplementsZupa { publicabstractvoidzamieszaj(); } classZupy { privateRosolrosol = newRosol() { publicvoidzamieszaj() {} publicvoidskladniki() {} }; privateZupagrzybowa = newZupa() { publicvoidskladniki() {} }; }
interfaceOperacja { intwykonaj(int a, int b);} classDodajimplementsOperacja { publicintwykonaj(int a, int b) { return a + b; } } classOdejmijimplementsOperacja { publicintwykonaj(int a, int b) { return a – b; } } classKalkulator { privateint result = 0; voidoperacja(Operacja op, intliczba) { result = op.wykonaj(result, liczba); System.out.println("Result: " + result); } }
public class Test { static public void main(String[] args) { new Kalkulator() .operacja(newDodaj(), 7) .operacja(newDodaj(), 5) .operacja(newOdejmij(), 1) .operacja(new Operacja() { public intwykonaj(int a, int b) { return a * b; } }, 10); } }
StaticNestedClasses • Klasa statyczna zagnieżdżona nie jest klasą wewnętrzną! Jest statyczną klasą typu top-class. • Ponieważ klasa jest statyczna, nie ma ŻADNYCH powiązań z klasą zewnętrzną. • Tworzenie SNC wymaga użycia nazwy klasy zewnętrznej.
Do czego to się przydaje? • lepsza organizacja kodu / enkapsulacja • tworzenie nowych typów w miejscu ich użycia • szybkie prototypowanie • pozwalają tworzyć zgrabny / elegancki kod
Wady • wzrasta liczba klas, którą musi załadować JVM • duża liczba wewnętrznych klas może zaciemnić kod • nie wszystkie IDE obsługują tak dobrze klasy wewnętrzne jak top klasy (refactoring / podpowiadanie). • raczej tylko dla doświadczonych programistów