2. előadás
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-catchutasí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 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.
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 (
classkulcsszó 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
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
packageutasítás - 0, 1 vagy több
importutasí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