Informatika4-2018/Gyakorlat5

A MathWikiből
(Változatok közti eltérés)
a (Feladatok)
a (Feladatok)
143. sor: 143. sor:
 
== Feladatok ==
 
== Feladatok ==
 
Írjunk '''Real''' osztályt, aminek van  
 
Írjunk '''Real''' osztályt, aminek van  
* Default konstruktora (0)
+
* Default konstruktora (0 legyen ekkor a szám)
 
* Egy paraméteres konstruktora (egy float szám a paramétere)
 
* Egy paraméteres konstruktora (egy float szám a paramétere)
 
* Összeadás és szorzás művelet (add, multiply)
 
* Összeadás és szorzás művelet (add, multiply)

A lap 2018. október 8., 11:51-kori változata

Előző - Fel - Következő

Tartalomjegyzék

Final, Immutable

final

tagváltozó

Ha tag-változó (adattag) előtt van a final kulcsszó, akkor azt jelenti, hogy a konstruktorban értéket kell neki adni és máshol pedig nem lehet!

public class Osztaly
{
    private final String name_;
    public Osztaly()
    {
        name_ = "";
    }
    public Osztaly(String name)
    {
        name_ =  name;
    }
    public void SetName(String name)
    {
        name_ =  name; // hibás!
    }
}

Konstruktoron kívül már egyenlőség jel bal oldalán nem szerepelhet, sem osztályon belül (private) sem kívül (public).

lokális változó

Ha egy függvényen belül lokális változó final, akkor csak egyszer inicializálható, egyszer állhat egyenlőség jel bal oldalán. De nem kell hogy ez egyből a deklaráció után legyen.

static public int ComputeX(int n)
{
    final int m;
    if (n==1)
        m = n;
    else if (n % 2 == 0)
        m = n/2;
    else
        m = 3*n + 1;
 
    // m új értéket már nem kaphat!
 
    return m;
}

függvény paraméter

Ha egy függvény paraméter final, akkor (hasonlóan) a függvény hívás után (a függvény belsejében) nem állhat egyenlőségjel bal oldalán.

final != const

Attól még, hogy valamit nem tudok egyenlővé tenni mással, változtatni még lehet. Ha egy osztálynak van setter-e, akkor azt hívhatom akkor is, ha az a példány final.

public class Osztaly
{
    private String name_;
    public Osztaly()
    {
        name_ = "";
    }
    public Osztaly(String name)
    {
        name_ =  name;
    }
    public void SetName(String name)
    {
        name_ =  name;
    }
    public static void main(String[] args)
    {
        final Osztaly peldany = new Osztaly("xyz");
        peldany.SetName("XYZ");  // OK
        peldany = new Osztaly(); // nem OK
    }
}

immutable

Ha egy osztály megváltoztathatatlan (immutable), az azt jelenti, hogy konstruálás után már nem lehet a benne lévő értékeket és állapotát megváltoztatni. Viszont lehet egy új példányt kreálni, ha ugyanazt a változót más értékkel akarjuk felruházni. A String például immutable, a primitív típusok wrapper-ei is immutable-ök (Integer, Boolean, Float).

public static void main(String[] args)
{
    String name = "abc";
    name[1] = "X"; // nem lehet!
 
    name = "aXc"; // lehet, egy új példány készül.
}
  • Erre sajnos nincsen kulcsszó, ha valaki úgy ír meg egy osztályt, hogy a fentiek teljesülnek rá, akkor sikerült egy immutable osztályt írnia, ha nem, akkor nem. Technikák immutable osztály írására:
    • Ha nincsen publikus setter
    • minden adattagja final és immutable
  • Ha egy változó immutable és final, akkor sem nem lehet egy kész példányt megváltoztatni, sem nem tud más példányra referálni.
  • Primitív típusok esetén könnyű, mert a final egyben immutable is.

Feladatok

Írjuk meg a User és Comment osztályokat immutable-nek.

Öröklődés

public class Osztaly
{
   ...
}
 
public class Gyerek extends Osztaly
{
   ...
}

A Gyerek osztály minden metódussal és tagváltozóval rendelkezik, amivel az Osztaly, és még mellé másokat is rakhatunk.

Láthatóság

Egy tagváltozó vagy metódus négyfelé lehet:

  • public
  • protected
  • semmi
  • private

Ezeknek a jelentése:

  • Ha egy attribútum private
    • ugyanaz az osztály láthatja
    • egy másik osztály ugyanabban a package-ben nem láthatja
    • egy másik osztály, ami öröklődik belőle nem láthatja
    • egy másik osztály, ami tőle független nem láthatja
  • Ha egy attribútum semmi
    • ugyanaz az osztály láthatja
    • egy másik osztály ugyanabban a package-ben láthatja (package-private)
    • egy másik osztály, ami öröklődik belőle nem láthatja
    • egy másik osztály, ami tőle független nem láthatja
  • Ha egy attribútum protected
    • ugyanaz az osztály láthatja
    • egy másik osztály ugyanabban a package-ben láthatja (package-private)
    • egy másik osztály, ami öröklődik belőle láthatja
    • egy másik osztály, ami tőle független nem láthatja
  • Ha egy attribútum public
    • ugyanaz az osztály láthatja
    • egy másik osztály ugyanabban a package-ben láthatja (package-private)
    • egy másik osztály, ami öröklődik belőle láthatja
    • egy másik osztály, ami tőle független láthatja

Feladatok

Írjunk Real osztályt, aminek van

  • Default konstruktora (0 legyen ekkor a szám)
  • Egy paraméteres konstruktora (egy float szám a paramétere)
  • Összeadás és szorzás művelet (add, multiply)
  • toString metódusa, ami a kiírást segíti elő.

Majd írjunk egy Complex osztályt, ami ezt egy komplex résszel egészíti ki

  • Legyen két paraméteres konstruktora (valós és komplex rész)
  • Összeadás és szorzás művelet (add, multiply) ez felülírja a valós műveleteket.
    • a szorzásból kettő legyen, amikor a jobb operandus valós, ill. komplex.
  • toString metódusa
  • Konjugálás metódusa
  • Abszolút érték metódusa, ami Real-t adjon vissza.

Írhatunk egy Quaternion osztályt is!

Előző - Fel - Következő

Személyes eszközök