Še o razredih: Doseg in večkratni konstruktorji

|

V prejšnji lekciji smo spoznali, da lahko razred obravnavamo kot objekt (predmet) in da lahko delamo kopije tega razreda ter jih poimenujemo z različnimi imeni.  Nove kopije (primerke ali instance) lahko naredimo s pomočjo konstruktorjev razreda. En tak konstruktor za vsak razred avtomatsko že obstaja (to je privzeti konstruktor), lahko pa ga sestavimo sami. Če prekrijemo privzeti konstruktor z novim, stari ne bo več na voljo.

Doseg (Scope)

Doseg (angleško scope) pri programiranju je del programa, v katerem obstaja neka spremenljivka. Kadarkoli v Javi deklariramo znotraj nekih zavitih oklepajev spremenljivko, obstaja ta le, dokler smo znotraj teh zavitih oklepajev, torej znotraj dosega. Poskusimo naslednje:

public class TestDoseg{
        public static void main(String[] args){
               private int mojeStevilo = 5; 
               // obseg je znotraj metode main
               System.out.println(mojeStevilo);     
               // kaksen izpis dobimo tu ?           
        }
}

Postavimo sedaj mojeStevilo v neko metodo izven metode main. Njegov doseg bo sedaj le znotraj te metode. Izven zavitih oklepajev, znotraj katerih je bila spremenljivka tvorjena, ne obstaja. Ko zapustimo območje teh zavitih oklepajev, je taka spremenljivka uničena.

Poskusi prevesti naslednji program in boš videl, kaj dobiš.

public class TestDoseg{
        public static void main(String[] args){
               
               System.out.println(mojeStevilo); 
                       // kaj pa sedaj dobis ?              
        }
        
        public void nekajNaredi(){
               private int mojeStevilo = 5; 
               // doseg spremenljivke je le znotraj metode nekajNaredi
        }
}

Večkratni konstruktorji

Če le zadošča našim potrebam, lahko vedno uporabimi privzeti konstruktor nekega razreda. Tak konstruktor je avtomatsko na voljo, čim deklariramo nek razred. Spomnimo se nekaj primerov::

Krog rdeciKrog = new Krog();
Krog modriKrog = new Krog();
Vesoljcek xyz = new Vesoljcek();
Vesoljcek alfaBeta = new Vesoljcek();

V prejšnji lekciji smo spoznali, da lahko privzeti konstruktor prekrijemo z lastnim:

public class Krog{
        int xcenter;
        int ycenter;
        int polmer;
        // nas lastni konstruktor
        public Krog(){
               polmer = 1;
        }
}

Ko uporabimo nas konstruktor, bo ob tvorbi novega kroga polmer vedno enak 1. Če pa bi želeli konstruktor, ki omogoča nastavitev lastne vrednosti polmera, bi lahko sestavili in uporabljali naslednjega:


public Krog(int r){
        polmer = r;
}

Uporaba tega konstruktorja bi izgledala tako: 

Krog maliKrog = new Krog (2);    //  krog s polmerom 2
Krog velikKrog = new Krog (50); //  krog s polmerom 50
 

Stvar bi lahko razvijali še naprej in dovolili, da uporabniki našega razreda nastavijo vse spremenljivke krogov. Poglejmo si konstruktor kroga s 3 argumenti :

public Krog(int x, int y, int r){
        xcenter = x;
        ycenter = y ;
        radius = r;
}

Poglejmo, kako sedaj izgleda naš razred Krog z vsemi dodanimi konstruktorji:

public class Krog{
        int xcenter;
        int ycenter;
        int premer;
        // nas prekriti privzeti konstruktor brez argumentov)
        public Krog(){
               polmer = 1;
        }
        // nas konstruktor z 1 argumentom
        public Krog(int r){
               polmer = r;
        }
        // nas konstruktor s 3 argumenti
        public Krog(int x, int y, int r){
               xcenter = x;
               ycenter = y ;
               polmer = r;
        }
}

Tako imamo sedaj na voljo kar 3 možnosti, kako naredimo nov primerek razreda Krog. Lahko naredimo:


Krog privzetiKrog = new Krog(); // polmer je1
ali :
Krog drugiKrog = new Krog(27); // polmer je 27
ali :
Krog tretjiKrog = new Krog(100, 75, 14);

Ta, tretji krog naj bi imel položaj 100:75 in bo imel polmer 14.

Seveda bi za trazred Krog morali napisati še metode za nastavljanje (setXXX) in ugotavljanje (getXXX) lastnosti jnegovih primerkov. Toliko prej, če bi želeli kroge kakorkoli spreminjati in premikati.

Vaja

Sestavi lasten razred Krog, pri katerem uvedeš vse prej omenjene konstruktorje, pa še metode dostopa, kot so setX, getX, sety, getY, setPolmer, gePolmer. Naredi še razred PreskusKroga z metodo main, v kateri vse konstruktorje in metode dostopa preskusiš.
Kako ti je šlo?