Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
getClass() final („végleges”) segítségével lekérhetjük az objektum osztályát, ősosztályát void PrintClassName(Object obj) { System.out.println("The Object's class is " + obj.getClass().getName()); } Object createNewInstanceOf(Object obj) { return obj.getClass().newInstance(); }
Egymásba ágyazott osztályok I. class TartalmazoOsztaly{... class BeagyazottOsztaly {... } } a beágyazott osztály hozzáfér a tartalmazó osztály minden tagjához (private-hez is) gyakran használják eseménykezelésre a beágyazott osztály lehet: teljes anonymous – metódusban definiáljuk
Egymásba ágyazott osztályok II. anonymous public class kezelo implements ActionListener { … } hourField.addActionListener(new kezelo()); helyette: hourField.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Integer.parseInt(e.getActionCommand); } )
Absztrakt osztály – példa abstract class Cat { String abstractClassName = "Cat"; //abstract classes can have variables String getAbstractClassName() { return abstractClassName; } abstract String getClassName(); //this must be implemented } class Himalayan extends Cat{ String className = "Himalayan"; public Himalayan() {} String getClassName() //must have this method { return className; } public static void main(String[] args) { //Cat percy = new Cat(); //can not instantiate an abstract class Himalayan cappuccino = new Himalayan(); System.out.println(cappuccino.getAbstractClassName()); //output is: Cat System.out.println(cappuccino.getClassName()); //output is: Himalayan } }
Interfészek az interfész egy protokollt definiál mely bárhol megvalósítható segítségével tulajdonképpen megvalósítható a többszörös öröklődés az interfész metódusokat definiál, de nem implementálja őket; definiálhat változókat is különbség az absztrakt osztály és az interfész között: egy interfész nem implementálhat metódusokat egy osztály több interfészt megvalósíthat az interfész nem tagja az osztályhierarchiának
Interfész definiálása az interfész örökölhet (extends – őse a szuper interfész) a metódusok törzs nélküliek csak static, final módosítók használhatóak minden public public interface StockWatcher extends PStockWatcher{ final String sunTicker = "SUNW"; final String oracleTicker = "ORCL"; final String ciscoTicker = "CSCO"; void valueChanged(String tickerSymbol, double newValue); }
Interfész megvalósítása minden az interfészben deklarált metódust meg kell valóstani az interfészt nem szabad módosítani! az extends az implements előtt szerepel public class StockApplet extends Applet implements StockWatcher {... public void valueChanged(String tickerSymbol, double newValue) { if (tickerSymbol.equals(sunTicker)) {... } else if (tickerSymbol.equals(oracleTicker)) {... } else if (tickerSymbol.equals(ciscoTicker)) {... } } }
Csomagok Minden osztály egy csomaghoz tartozik Beépített és saját (felhasználói) csomagok Deklaráció: kód első sora package xy.gw; Hierarchikus, könyvtárstruktúrának követnie kell Ha nem adjuk meg: default package import (kb. mint C++ include)
Csomagkezelés az osztálykezelés egyszerűbbé tétele feloldja az elnevezési problémákat az összefüggő osztályokat csomagokba lehet foglalni a csomagon kívül csak a public tagok, osztályok hozzáférhetőek elnevezésre a cégek a cég URL címének inverze használható: com.company.package package graphics; public class Circle extends Graphic implements Draggable {... }
Csomagok használata Hivatkozhatunk a tagra a teljes névvel A csomag tagot importáljuk Az egész csomagot importáljuk
Csomagok – példa src/world/HelloWorld.java package world; public class HelloWorld { … } src/world/moon/HelloMoon.java package world.moon; public class HelloMoon { … } world.HelloWorld myWorld = new world.HelloWorld(); import world.*; import world.moon.HelloMoon; import java.util.*; HelloMoon myMoon = new HelloMoon(); S tring holeName = myMoon.getHoleName();
Standard java csomagok java.lang (nyelvi elemek – nem kell importálni!!)) wrapper osztályok (Integer, Byte,...) Math (Math.PI, Math.sin(1), statikus!!) Object (ősosztály, clone, equals, toString, finalize) System (in, out, err, setIn, setOut, setErr, gc, exit, arrayCopy, currentTimeMillis) Thread (párhuzamos programozás) java.io (IO műveletek, file, nyomtatás, stream-ek használatával) java.net (hálózati kommunikáció, socket, datagramm, URL) java.applet (Appletek) java.util (időzítő, adatszerkezetek (hash, vektor), dátum, StringTokenizer,...) java.util.regex, java.util.logging,... java.awt (grafikus felület, eseménykezelés) javax.swing (újabb grafikus könyvtár...) java.sql (SQL, adatbázis kapcsolat)
Upcasting az új osztály a meglévő osztály egy típusa (ősosztálya) minden üzenetet melyet az ősosztálynak küldhetünk elküldhető a gyermek osztálynak is a Java erősen típusos nyelv azonban a gyermek referencia ős referenciává alakítása működik (upcasting)! mindig biztonságos (egy specifikusabb megvalósításból megyek egy általánosabbra) ezért nem kell semmilyen módon jeleznünk a fordító számára class Instrument { public void play() {} static void tune(Instrument i) { //... i.play(); } // Guitar objects are instruments // because they have the same interface: public class Guitar extends Instrument { public static void main(String[] args) { Guitar g = new Guitar(); Instrument.tune(g); // Upcasting }
Kései kötés (late binding) Shape s = new Circle(); s.draw(); Minden metódus így működik Kivétel final, static (ezzel gyorsíthatjuk a programot, a fordító hatékonyabb kódot generál, a private metódusok is finalként működnek) A private metódus nem felülírható !!! public class PrivateOverride { private void f() { System.out.println("private f()"); } public static void main(String[] args) { PrivateOverride po = new Derived(); po.f(); } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); }
Downcasting Az upcasting biztonságos downcasting-nál meg kell vizsgálni a referenciát RTTI (run time type identification) ClassCastException
RTTI Class objektum – minden általunk használt osztályhoz static Class Class.forName(name, …) Class.newInstance() public final Class Object.getClass() instanceof Amikor egy objektumot létrehozunk a JVM megnézi, hogy az adott Class objektum be van-e már töltve, ha nincs akkor betölti (nem töltődik be minden a program elindításakor)
public static void main(String[] args) Kötelező formátum java osztálynév ”elso parameter” Tesztelésre minden osztályba használható
JAR fájlok kezelése jar cf jar-file input-file(s) – becsomagolás jar tf jar-file – tartalom megtekintése jar xf jar-file [archived-file(s)] – kicsomagolás java -jar jar-file – futtatás jar uf jar-file input-file(s) – frissítés jarsigner jar-file alias – aláírás jarsigner -verify jar-file - ellenőrzés
public paint(Babu b) { b....(); if (b instanceof Lovas) { Lovas l = (Lovas)b; l....(); } else … }