Kihagyás

2. előadás

Osztály fogalma

OEP - Osztály fogalma


Egységbe zárás

class Time {
    int hour;
    int minute;

    //A `hour` és `minute` változókat egységbe zárjuk 
    Time( int hour, int minute ){
        if (0 <= hour && hour < 24 && 0 <= minute && minute < 60){
            this.hour = hour;
            this.minute = minute;
        } else {
            throw new IllegalArgumentException("Invalid time!"); // Kivételt (exception) dobunk, ha nem megfelelő a paraméter
        }
    }
}

Kivétel (exception)

  • Futás közbeni hiba
  • Program leállását eredményezheti
  • Lekezelhető a try-catch utasítással
class Main {
    public static void main(String[] args){
        Time morning = new Time(24, -1); // that's a bit sussy
    }
}
Exception in thread "main" java.lang IllegalArgumentException: Invalid time!
    at Time.<init>(Time.java:9)
    at Main.main(Main.java:3)

A minute passed...

Láthatóság

A fenti kódban lévő paraméterek változtathatóak kívülről is

class Main{
    public static void main(String[] args){
        // Time morning = TimeBuilder.FromTemplate(Morning.GOOD) - That means it's a good morning 👋
        Time morning = new Time(6, 10);
        morning.hour = -1; // Oh nyo
    }
}

Private: csak a class-ben látható (közvetlenül)

class Time {
    private int hour; // 0 <= hour < 24
    private int minute; // 0 <= minute < 60
    ...
}
class Main {
    public static void main( String[] args ){
        Time morning = new Time(6,10);
        morning.aMinutePassed();
        morning.hour = -1; // fordítási hiba
    }
}

Szeretnénk, hogy a hour és minute paraméterek mégis olvashatóak legyenek. Kell írni rá műveleteket, amely ezt az adatot ki tudja nyerni.

class Time {
    ...
    int getHour() { return this.hour; }
    int getMinute() { return this.minute; }
    ...
}

Hasonló módon létrehozható az értéket átállító művelet is

class Time {
    ...
    int getHour() { return this.hour; }
    void setHour( int hour ){
        if( 0 <= hour && hour <= 23 ){
            this.hour = hour;
        } else {
            throw new IllegalArgumentException("Invalid hour!");
        }
    }
    ...
}

Mivel a hour és a minute között szoros kapcsolat van, könnyebb lenne a kettőt egy adattagban tárolni.

class Time {
    private short minutes;
    Time( int hour, int minute ){
        if (0 <= hour && hour < 24 && 0 <= minute && minute < 60){
            minutes = 60*hour + minute;
        } else {
            throw new IllegalArgumentException("Invalid time!");
        }
    }
    int getHour(){ return minutes / 60; }
    int getMinute(){ return minutes % 60; }
    void setHour( int hour ){
        if( 0 <= hour && hour <= 23 ){
            minutes = 60 * hour + getMinute();
        } else {
        throw new IllegalArgumentException("Invalid hour!");
        }
    }
}

Interfész: Ami látszódik az osztályban (nyílvános adattagok)

Csomagok

  • Program tagolása (hierarchiába szervezhető)
  • Összetartozó osztályok összefogása
  • Programkönyvtárak
    • Szabványos programkönyvtár

A package utasítás

  • Minden osztálynak van egy rövid neve (class kulcsszó után)
  • A teljes neve a csomag névvel minősített név

Például:

  • rövid név: Point
  • hosszú név: geometry.Point
package geometry;

class Point {
    int x, y;
    void move( int dx, int dy ){
        x += dx;
        y += dy;
    }
}

A csomagok egymásban, egy hierarchiába építhetőek.

Például:

  • Szabványos programkönyvtárból a java.net.ServerSocket
  • hu.elte.kto.teaching.javabsc.geometry.basics.Point

A hierarchikus csomagszerkezet felépítését követnie kell a könyvtárszerkezetnek is

Literally the most contrived way of compiling known to man:

$ javac geometry/basics/*.java #fordítás. Teljes **fájl** elérési úttal
$ java geometry.basics.Main #futtatás. Munkakönyvtárból nézett **csomag** elérési úttal
Among Us!

Névtelen csomag

Default/anonymous package

  • Ha nem írunk package utasítást
  • Forrásfájl közvetlenül a munkakönyvtárba
  • Kis kódbázis esetén rendben van

Láthatósági kategóriák

Kategória kulcsszó Hol látható?
Privát, rejtett private Csak az osztálydefiníción belül
Félnyilvános, package-private semmi Csak az ugyanabban a csomagban lévő osztálydefiníciókban
Publikus, nyílvános public Osztály tagok, konstruktor is

Példa:

package hu.elte.kto.javabsc.eloadas;
public class Time {
    private int hour; // 0 <= hour < 24
    private int minute; // 0 <= minute < 60
    public Time( int hour, int minute ){ ... }
    public int getHour(){ return hour; }
    public int getMinute(){ return minute; }
    public void setHour( int hour ){ ... }
    public void setMinute( int minute ){ ... }
    public void aMinutePassed(){ ... }
}

A Time class teljes neve: hu.elte.kto.javabsc.eloadas.Time

import kulcsszó

Minősített név feloldása

Alapértelmezett esetben ezt a teljes nevet kell használni, amikor a csomagon kívüli classt fel akarod használni:

class Main{
    public static void main(String[] args){
        hu.elte.kto.javabsc.eloadas.Time time = new hu.elte.kto.javabsc.eloadas.Time(6, 10);
    }
}

Ezt az import kulcsszó segítségével lehet rövidíteni.

import hu.elte.kto.javabsc.eloadas.Time;
class Main{
    public static void main(String[] args){
        Time time = new Time(6, 10);
    }
}

Forrásfájlban több típusdefiníció

Egy forrásfájlban lehet több típusdefiníció is, ha csak az egyik publikus (amelynek a neve megegyezik a fájl nevével).

Például:

package hu.elte.kto.javabsc.eloadas;

public class Time {
    ...
}

class Main {
    public static void main( String[] args ){
        Time morning = new Time(6,10);
    }
}

java.lang csomag típusait nem kell feloldani, azok alapértelmezetten be vannak importálva.

Fordítási egység szerkezete

  • Opcionális package utasítás
  • 0, 1 vagy több import utasítás
  • 1 vagy több típusdefiníció

javac kapcsolók

  • -d <directory>
    • Specify where to place generated class files.
  • --source-path <path>
    • Specify where to find input source files.
  • --class-path <path>
    • Specify where to find user class files.

.jar fájlok

Java ARchive

valójában .zip fájl, amelyben van java-hoz kapcsolódó meta adatok