Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Ez egy picit összetett dolog, biztosan ki is fogok felejteni valamit.
    Használat módjai:

    - static osztály változók: nem keletkeznek objektumonként, hanem az osztály összes példánya közösen használja a változót
    pl.
    class A { static int count; A() {count++;} }
    esetén minden egyes konstruktorhívásnál inkrementálódik a count.

    - static tagfüggvények: az előbbihez kapcsolódik, ugyanis ilyen függvényhez nem tartozik objektum. Ezt úgy értem, hogy a class A { static void fgv() {} } oszály fgv függvénye így hívható: A.fgv(); Természetesen ennél fogva nincs az fgv-ben definiálva ''this'' változó és ezért nem-static osztály változók/függvények sem használhatók, viszont static-kel jelöltek igen. (Persze ha átadsz paraméterben bármilyen objektumot, azzal azt csinálsz amit akarsz.)

    - static belső osztályok: olyan osztályon belül definiált osztályok, melyek nem kapcsolódnak a külső osztályhoz példányszinten. Huh, ez bonyi :)
    Na szóval:
    class A { static int count; int local; static class B { }}
    ilyenkor az A.B osztály példányosítható A-n kívülről. Egyébként nem! Továbbá az A.B osztály nem fér hozzá az A.local változóhoz, de az A.counthoz igen.

    Ööö van még valami?! :)

    [Szerkesztve]

    Kiegészíteném a nem-static belső class-ról mondottakat azzal, hogy példányosíthatóak kívülről, amennyiben a new operátor egy kevéssé szokásos szintaxisát használjuk.
    pl. legyen:


    class A {
    int a;

    class B {
    void ezmuxik() {
    // itt hivatkozunk a kulso osztalyra! Ehelyett irhatunk a++;-t, ha az egyertelmu.
    A.this.a++;
    }
    }
    }

    Van egy másik osztály, mely ezt csinálja:

    class C {
    void f() {
    // hibas! ''no enclosing instance of A''
    new A.B();
    // gyartunk egy A-t
    A a_peldany=new A();
    // explicit megadhato az enclosing instance!
    A.B ab_peldany=a_peldany.new B();
    }
    }


    Na kezd teljes lenni a dolog. Remélem érthető.

Új hozzászólás Aktív témák