Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaCsaba Horváth Megváltozta több, mint 7 éve
1
Java bevezető Beágyazott rendszerek szoftvertechnológiája c. tárgyhoz
2017 Erdős Csanád, Györke Péter Összeállította: Orbán Gergely
2
Áttekintés Alapok Típusok, osztályok Nyelvi elemek, feature-k Rendezés
GC, Operátorok, Exception, RTTI... Rendezés Elnevezés, fájlok, Package Hasznos beépített típusok String, Collections IO Threading Hálózat GUI
3
Filozófia C++-nál egy szinttel magasabban OO (tényleg)
Megkötések -> kevesebb hibalehetőség pl. nincs pointer, van garbage collector Erős szolgáltatások (library-k) Platform független 2 szintű fordítás Legközelebbi alternatíva: C#
4
Fordítás Menete: Just In Time (JIT) compiler
source (.java) compile (javac Package/MyClass.java) byte code (.class) interpreter, Virtual Machine (java Package.MyClass) Just In Time (JIT) compiler Futás előtt közvetlenül fordít Kompilált és interpretált nyelvek előnyei Java nem sokkal lassabb, mint a C++ (44%) class-ok tömöríthetők: jar
5
Futtatás Belépési pont: Hello world:
public static void main(String[] args) több is lehet egy projektben Hello world: class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); } }
6
Típusok Primitív vs Referencia C++ const -> final static
Kép forrása:
7
Primitív típusok Értékadáskor másolódik Platform független byte méret
Nincs unsigned, csak char (2 byte) C++-nál szigorúbb implicit konverzió byte -> short -> int -> long -> float -> double char -> int -> long -> float -> double Intuitív default kezdőértékek Van boolean de nem konvertálódik Mi nem definiálhatunk új típust int a = 1; int b = a; ++b; System.out.println(a); // 1
8
Referencia típusok C++ referencia szerű, de lehet null
Értékadáskor csak a referencia másolódik "Kell new" (stacken nem hozhatók létre) Saját típusaink Tömb is referencia típus MyType a = new MyType(); a.x = 1; MyType b = a; ++b.x; System.out.println(a.x); // 2
9
Referencia típusok 2 Konstruktor Nincs destruktor!
Van default, de csak ha nincs más Nincs destruktor! finalize kerülendő class TypeA { } class TypeB { TypeB(int p) { } TypeA a = new TypeA(); // TypeB b = new TypeB(); // The constructor TypeB() is undefined.
10
Referencia típusok 3 Van csomagoló osztály a primitív típusokhoz
pl. Integer (de ez tipikusan 16+ byte) Vigyázat: immutable Integer a; Integer b; a = new Integer(2); b = a; System.out.println(b == a); // true a++; a--; System.out.println(b == a); // false
11
Osztályok Kulcsszavak Láthatóság Konstruktor class, extends
final class TypeA { } // abstract class TypeB extends TypeA {} // The type TypeB cannot subclass // the final class TypeA abstract class TypeB { protected int i; } class TypeC extends TypeB { TypeC() { super(); super.i = 1; i = 2; Kulcsszavak class, extends max 1 szülő this super(), super.* final abstract Láthatóság public default (package) (protected, private csak belső osztálynál) Konstruktor Ha nincs super() hívás, a fordító pótolja
12
Tagváltozók static final (csak konstruktorból állítható) Konvenció
protected vagy private Publikus elérés: getter, setter class TypeA { protected int i_; public int getI() { return i_; } public void setI(int i) { i_ = i;
13
Metódusok Láthatóság Lehet abstract Van overload
private, protected, public, default (package) Lehet abstract Van overload Csak érték szerinti átadás public static void main( String[] args ){ Dog aDog = new Dog("Max"); foo(aDog); if (aDog.getName().equals("Max")) { //true System.out.println( "Java passes by value." ); } else if (aDog.getName().equals("Fifi")) { System.out.println( "Java passes by reference." ); } public static void foo(Dog d) { d.getName().equals("Max"); // true d = new Dog("Fifi"); d.getName().equals("Fifi"); // true aDog.getName().equals("Fifi"); // true public void foo(Dog d) { d.setName("Fifi");
14
Object Mindenki az Object-ből származik Virtuális metódusok
clone Addig jó, amíg csak primitív és immutable tagjaink vannak equals alapból csak referenciát vizsgál hashCode finalize toString debughoz hasznos final metódusok getClass, notify, notifyAll, wait
15
Inner class Van referenciája a tartalmazó osztályra
class TypeA { private int i; class TypeAA { void print() { System.out.println(i); } static class TypeAB { // Cannot make a // static reference to the // non-static field i // void print() { // System.out.println(i); // } Van referenciája a tartalmazó osztályra Eléri a tartalmazó objektum mezőit Lehet név nélküli (anonymous) static változat nested class-nak hívják nincs referenciája csak strukturálásra Példa (forrás: public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public void sayHello() { // Inner class class EnglishGreeting implements HelloWorld { String name = "world"; public void greet() { greetSomeone("world"); } public void greetSomeone(String someone) { name = someone; System.out.println("Hello " + name); } } HelloWorld englishGreeting = new EnglishGreeting(); // Anonymous inner class HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } }; englishGreeting.greet(); frenchGreeting.greetSomeone("Fred"); } public static void main(String... args) { HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses(); myApp.sayHello(); } }
16
Interface Kulcsszavak Nincs benne implementáció
interface, implements Nincs benne implementáció Többszörös öröklés helyett Minden tagja public Lehet hierarchikus Lehet tagváltozója, de csak final
17
Garbage collector (GC)
"new van, delete nincs" Időnként begyűjti a nem hivatkozott objektumokat Generációkra bontott Némi overhead, cserébe nincs leak Nem célszerű kézzel hívni Kép forrása:
18
Operátorok, vezérlési szerkezetek
Alap szinten C++ Nincs sizeof Van instanceof... ...de nem OO Speciális break egymásba ágyazott ciklusokból goto szerű labelekkel Nincs operator overload
19
Exception try - catch - finally finally: mindig lefut
throws: amit dobhat Kivétel Error RuntimeException void riskyMethod() throws Exception { throw new Exception(); } ... try { myResource.open(); riskyMethod(); } catch (Exception e) { throw e; } finally { myResource.close();
20
Exception 2 Szerves része a nyelvnek Csak Throwable leszármazottak
Beépített Exception osztály és sok specifikus leszármazott Elkapni csak akkor, ha érdemben tudjuk kezelni Bátran dobjuk tovább Kép forrása:
21
Real time type information (RTTI)
Típusinformáció futás közben Csábító, de ritkán kell ténylegesen downcasting Beépített könyvtáraknál kellhet getClass név alapján példányosítás
22
Elnevezési konvenció osztály: CamelCase
metódus, lokális változó: lowerCamelCase konstans: pl. MAX_VALUE
23
Források rendezése 1db forrásfájlban max 1db public class
A nevük azonos Nem válik el a deklaráció és a definíció Package-be rendezés Kép forrása:
24
Package namespace helyett Könyvtárstruktúrához kötött import
using helyett lehet/ajánlott itt is csak egy osztályt konvenció: reverse domain név pl. hu.bme.mit.aknakereso Jar-ba tömörítés jar cfe jar-file entry-point input-file(s) java -jar jar-file
25
Hasznos 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)
26
String Immutable StringBuilder, String.format Összehasonlítás
Minden módosító művelet új Stringet hoz létre StringBuilder, String.format hatékony String létrehozás Összehasonlítás compareTo equals egyenlőség operátor String s1 = "alma"; String s2 = "alma"; String s3 = new String("alma"); System.out.println(s1 == s2); // true System.out.println(s1 == s3); // false System.out.println(s1.equals(s3)); // true
27
String String műveletek regex támogatás indexOf replace substring
split ... regex támogatás
28
Collections Generikusak ArrayList: tömb helyett (C++ stl::vector)
LinkedList (C++ stl::list) HashMap (C++ stl::hash_map) import java.util.ArrayList; import java.util.HashMap; import java.util.List; ... List<Integer> vec = new ArrayList<Integer>(); java.util.Collections.sort(vec); HashMap<String, Double> map = new HashMap<String, Double>(); map.put("key", 1.0); System.out.println(map.get("key"));
29
Iterator Kollekciók általános kezelése hasNext next remove
ListIterator: több funkció ArrayList<String> l = new ArrayList<String>(); Iterator<String> itr = l.iterator(); while (itr.hasNext()) { String element = itr.next(); System.out.printf("%s ", element); }
30
IO Stream alapú (byte) Reader / Writer: karakteres kezelés
buffered: hatékonyabb Don't forget to flush :) Scanner tokenizál bufferelt(karakter(byte))
31
IO 2 Main() throws FileNotFoundException, IOException {
BufferedReader reader = null; BufferedWriter writer = null; try { reader = new BufferedReader( new InputStreamReader( new FileInputStream("valami.txt"))); writer = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("valami.txt"))); } catch (FileNotFoundException e) { System.out.println("Valami hiányzik."); throw e; } finally { if (reader != null) reader.close(); if (writer != null) writer.close(); }
32
Serialization implements Serializable ObjectInputStream
Csak jelzés ObjectInputStream readObject() ObjectOutputStream writeObject() Kép forrása:
33
Serialization 2 class CustomClass implements Serializable { } ...
ObjectOutputStream oos = null; ObjectInputStream ois = null; try { oos = new ObjectOutputStream(new FileOutputStream(fname)); oos.writeObject(new CustomClass()); } finally { oos.close(); } ois = new ObjectInputStream(new FileInputStream(fname)); CustomClass c = (CustomClass)ois.readObject(); ois.close();
34
Threading Processzen belül Tud párhuzamosan futni
Gyorsabb váltás Tud párhuzamosan futni implements Runnable vagy extends Thread Kezelés start, join, yield Szinkronizáció synchronized Metódus vagy kódblokk, előbbi preferált Adott objektumra vonatkozik wait, notify, notifyAll Hatékony egymásra várakozás Kép forrása:
35
Threading 2 class CustomClass implements Runnable {
public void run() { try { Thread.sleep(0); } catch (InterruptedException e) { } } ... CustomClass c = new CustomClass(); Thread t = new Thread(c); t.start(); t.join();
36
Socket TCP kommunikáció (van UDP változat is) new Socket
getInputStream getOutputStream close ServerSocket accept
37
Socket példa class Client implements Runnable { public void run() {
try { Socket s = new Socket("localhost", 4444); BufferedReader r = new BufferedReader( new InputStreamReader( s.getInputStream())); String line; while ((line = r.readLine()) != null) { System.out.println(line); } r.close(); s.close(); } catch (IOException e) { System.out.println("failed"); class Server implements Runnable { public void run() { try { ServerSocket ss = new ServerSocket(4444); Socket cs = ss.accept(); BufferedWriter w = new BufferedWriter( new OutputStreamWriter( cs.getOutputStream())); w.write("Hello"); w.flush(); w.close(); cs.close(); ss.close(); } catch (IOException e) { System.out.println("failed"); }
38
GUI: AWT, Swing Fa szerkezet JFrame, JDialog JPanel JMenuBar
root elemek JPanel contentPane helyére bármi csoportosítására JMenuBar menü tipikusan a frame-be JComponent közös ős (rootok kivételével)
39
JComponent extends Container extends Component addMouseListener
addKeyListener add setLayout(LayoutManager) setPreferredSize Minimum, Maximum is nem minden LayoutManager törődik vele setAlignmentX és Y
40
LayoutManager BorderLayout BoxLayout (1D) CardLayout (lapozható)
FlowLayout (sorfolytonos) GridBagLayout flexibilis rács, főleg GUI builderrel GridLayout (rács) GroupLayout (főleg GUI builderrel) SpringLayout (relatív elhelyezkedés)
41
Rajzolás paintComponent felülírása repaint() hívás
Rajzolás Graphics-szal, Graphics2D-vel. repaint() hívás repaint(x, y, w, h): hatékonyabb, lehet többször is class MyPanel extends JPanel { ... protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("This is my custom Panel!", 10, 20); g.setColor(Color.RED); g.fillRect(x, y, w, h); g.setColor(Color.BLACK); g.drawRect(x, y, w, h); } } package painting; import javax.swing.SwingUtilities; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.BorderFactory; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseMotionListener; import java.awt.event.MouseMotionAdapter; public class SwingPaintDemo3 { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { System.out.println("Created GUI on EDT? " SwingUtilities.isEventDispatchThread()); JFrame f = new JFrame("Swing Paint Demo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new MyPanel()); f.pack(); f.setVisible(true); } } class MyPanel extends JPanel { private int squareX = 50; private int squareY = 50; private int squareW = 20; private int squareH = 20; public MyPanel() { setBorder(BorderFactory.createLineBorder(Color.black)); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { moveSquare(e.getX(),e.getY()); } }); addMouseMotionListener(new MouseAdapter() { public void mouseDragged(MouseEvent e) { moveSquare(e.getX(),e.getY()); } }); } private void moveSquare(int x, int y) { int OFFSET = 1; if ((squareX!=x) || (squareY!=y)) { repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); squareX=x; squareY=y; repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); } } public Dimension getPreferredSize() { return new Dimension(250,200); } protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("This is my custom Panel!",10,20); g.setColor(Color.RED); g.fillRect(squareX,squareY,squareW,squareH); g.setColor(Color.BLACK); g.drawRect(squareX,squareY,squareW,squareH); } }
42
Egyéb jótanácsok Verziókövetés GUI editor
Kollaborációhoz elengedhetetlen SVN Git GUI editor WindowBuilder Eclipse Netbeans
43
További anyagok Magyarázós példák:
Bruce Eckel: Thinking in Java, 4th edition Alapoktól és átfogó Ingyen letölthető a 3. kiadás Berg, Fritzinger: Java felsőfokon Magyar nyelvű Kép forrása:
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.