gdf-1
DESCRIPTION
gdf-1TRANSCRIPT
Bevezetés, az első félév anyagának összefoglalása
Programozási technológiaProgramozási technológia
A Java programozási nyelvObjektum-orientált technológia és adatszerkezetek
Dr. Fauszt Tibor
Átismételjük:
• A szoftverfejlesztési folyamatot és eszközeit.
• Az értelmező program és a fordítóprogram közti különbséget.
• A Java Virtuális gép funkcióját, a bájtkód szerepét.
• A különböző funkciójú Java programok néhány tulajdonságát (konzolos, GUI, Applet, JSP)
• A vezérlési szerkezeteket és adattípusokat
Szoftver ma
5,260,000,000
Szoftver alkalmazások
• Nagyvállalati rendszerek
• Adatbázisok
• Internet, e-mail, stb.
• Katonaság
• Beágyazott rendszerek
• Tudományos kutatások
• Office programcsomagok, vállalati, egyéni kisalkalmazások
• Grafika, fotó, videó
• Média
• Játékok
• Stb.
Szoftver fejlesztés
• Hangsúly a hatékonyságon Gyors algoritmusok Kis program méret Limitált
memóriahasználat
• Titkos kód
• Nem felhasználóbarát
• Hangsúly A programozók
hatékonyságán Csapatmunka A kód
újrafelhasználható-sága
Karbantarthatóság Hordozhatóság
• Jól dokumentált
• Felhasználóbarát
1950-1960: Manapság:
Programozási nyelvek
1940 1950 1960 1970 1980 1990 2000
Gépi kód
Assembly
FortranBasic
Pascal
Scheme
C C++
JavaLISP
Smalltalk Smalltalk-80
C#
Logo
Python
Java nyelv kialakulása
• Sun Microsystems 1990, projekt indul.Cél: részesedést szerezni az „okos” processzorokkal vezérelt, programozható készülékek területéből.
• Ehhez architektúra független technológia kellett, amely megvalósítja a kész programok hálózati letöltését és megbízható futtatását.
• Kezdetben C++ de alkalmatlannak találták a feladat megvalósításához.
C++, vagy más?
• C++ nyelv alapja, de egyszerűsítve, továbbfejlesztve.
• Nyelv atyja: James Gosling, egy irodája előtt álló tölgyfáról Oak-nak nevezte el, de a név már foglalt volt.
• Imported from Java.
A kezdetek
• Az internet a programozható eszközökhöz hasonló körülményeket teremt, hasonló körülményeket támaszt.
• 1995. május 23. a Javavilághódító útja elindul, minta böngészőkben futtathatókisalkalmazások (appletek)fejlesztőeszköze.
Java program típusok
Konzol alkalmazások
GUI alkalmazások
AppletekJSP lapok
Servletek
Mobil alkalmazások
Java alapfogalmak
• JVM (Java Virtual Machine) Java virtuális gép, értelmezi és futtatja a Java programot.
• JRE (Java Runtime Environment) Jáva futtatási környezet. Különböző számítógépes platformokra készül, a Java nyelven írt programok futtatásához szükséges. Tartalmazza a JVM-et és bővítményeket a böngészőkhöz.
• JDK (Java Development Kit) Java programok fejlesztéséhez szükséges eszköz. (készítés, fordítás, debuggolás, dokumentáció JVM is.)
• Java API (Application Programming Interface) alkalmazásprogramozási felület. Java osztálygyűjtemények.
Java platformok
• A legtöbb platform a hardvert és az operációs rendszert jelenti.
• A Java platform teljes egészében szoftverplatform, és különböző hardver alapú platformokra épül.
• Java platform 2 része: Java virtuális gép (Java Virtual Machine) Java alkalmazás-programozási felület
(Java Application Programming Interface)
• Az alap platform (J2SE)
• Mobil eszközök programozása (J2ME)
• Webszolgáltatások, üzleti alkalmazások (J2EE)
Szoftverfejlesztő eszközök
• Editor A forrásprogram megírására
(txt)
• Compiler A forrásprogram tárgykódú
lefordítására (nem gépi kód, csak specifikus instrukciók egy meghatározott CPU számára)
• Linker Végrehajtható programot
generál egy, v. több tárgykódból. Pl. exe.
• Debugger A program hibafeltárására
szolgáló eszköz, amellyel lépésről lépésre végrehajtható és elemezhető a program
Fordító nyelvek:Szerkesztés-Fordítás-Összeépítés-Futtatás
Editor Forrás kód
Compiler Tárgy-kód
Linker Végre-hajtható programEditor Forrás
kódCompiler Tárgy-
kód
Editor Forrás kód
Compiler Tárgy-kód
Értelmező típusú nyelvek:Szerkesztés-Futtatás
Szerkesztés Forrás kód
Értelmező
Fordító vs. Értelmező
•Compiler: Szintaktikai hibák
ellenőrzése már szerkesztés közben
Gépi kódú utasításokat generál
Platform függő Szigorúbb
típusmegkötés A program futása
gyorsabb
• Interpreter: Szintaktikai hibák
ellenőrzése futás közben
Értelmezi, majd végrehajtja a program utasításait
Platform független Dinamikus típusosság
A program futtatása lassabb
A Java hibrid megközelítése:Fordító + Értelmező
• A Java fordító lefordítja a Java forráskódot tárgykóddá, amelyet a Java virtuális gép (JVM) értelmezni tud
• Ezt az instrukciókat tartalmazó tárgykódú állományt hívjuk bájtkódnak amely minden platformon futtatható amelyen telepítve van a Java virtuális gép.
• A CPU specifikus Java virtuális gép fogja értelmezni és végrehajtani a bájtkódot.
Java megoldása Compiler + Értelmező
Szerkesztő
Hello.java
Fordító
Hello.class
Hello,World!
Értelmező
PlatformokWintel = Windows+Intel
Lintel = Linux+IntelRISC+UNIX (Sun + Solaris)Macintosh Apple + MacOS
JVM
Miért bájtkód?
• Platform-független
• Az értelmező gyorsabb és kisebb lehet így, mintha a forráskódot kellene értelmeznie és végrehajtania
• A forráskódot elrejthetjük a felhasználók elől
• Az értelmező kiszűrheti az ártalmas kódot, biztonsági ellenőrzést végezhet
JDK — Java Development Kit
• javac Java fordító
• java Java értelmező
• appletviewer Appletek tesztelése
böngésző nélkül
• javadoc HTML dokumentáció
generálására a forráskód megjegyzéseiből
• jar Osztályok csomagolása .jar
fájlokba
Parancsvezérelt eszközök, nem GUI
Programkészítés lépései
• JDK letöltése és telepítése. Ez tartalmazza a JRE-t is. Fordító (java forrásból java bájtkód) Ingyenes
• Egyszerű szerkesztő, pl. Notepad++ forráskód megírása.
• Forráskód mentése .java kiterjesztéssel, az osztállyal azonos néven.
• Fordítás: /bin könyvtárban található javac.exe fordítóval. A fordítás során a forráskóddal azonos
nevű .class kiterjesztésű állományok jönnek létre.
• Futtatás: /bin könyvtárban található java.exe programmal futtatjuk a .class állományokat.
javac HelloWorldApp.java
HelloWorldApp.java
java HelloWorldApp.class
JDK (folytatás)
• Ingyenes, letölthető az Oracle honlapjáról
• Az összes dokumentáció megtalálható on-line.
• Számos további Java erőforrás található és letölthető
Java IDE
• Grafikus felhasználói felület a fejlesztéshez
• Integrálja a szerkesztőt, a fordítót, a futtató környezetet, az applet megjelenítőt, a debuggert, a dokumentumkészítőt, egyéb eszközöket: Szintaktikai és szemantikai ellenőrzés, a navigálás
elősegítése a forráskódban, konzol, stb. Projektek kezelése, fejlesztőcsomagok telepítése.
• Általában a JDK- települ először és a fejlesztőeszköz erre épül.
NetBeans IDE
• Web-mobil alkalmazások, fejlesztéséhez kiváló, ingyenes fejlesztőeszköz.
Forrásszerkesztő
ablak
Konzol
Projekt ablak
Navigátor ablak
Konzolos alkalmazások
C:\> path=%PATH%; c:\Program Files\Java\jdk1.6.0_23\bin\C:\> javac Hello.javaC:\> java HelloAdd meg a Vezetékneved: NagyAdd meg a Keresztneved: KatalinSzia, Nagy KatalinNyomj meg egy gombot a folytatáshoz...
• Simple text dialog:Üzenet input, üzenet input ... eredmény
Hello.java
import java.util.Scanner;
public class Hello{ public static void main(String[ ] args) { Scanner kboard = new Scanner(System.in); System.out.print("Add meg a vezetékneved: "); String vezetekNev = kboard.nextLine( ); System.out.print("Add meg a keresztneved: "); String keresztNev = kboard.nextLine( ); System.out.println("Hello, " + vezetekNev+ " " + keresztNev); System.out.println("Üdvözöllek a Javaban!"); }}
Adatbevitel
Parancssori argumentumok
C:\> java Hello Nagy Katalin
Hello, Nagy Katalin
public class Greetings{ public static void main(String[ ] args) { String vezetekNev = args[ 0 ]; String keresztNev = args[ 1 ]; System.out.println("Hello, "+vezetekNev + " "+keresztNev); }}
A parancssori argumentumok átkerülnek a programba
GUI Alkalmazások
Menük
Nyomógombok
Esemény-vezéreltpanelek
Csúszkák
HelloGui.java
import java.awt.*;import javax.swing.*;
public class HelloGui extends JFrame{ < ... kód >
public static void main(String[ ] args) { HelloGui window = new HelloGui( ); window.setBounds(300, 300, 200, 100); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setVisible(true); }}
GUI osztálygyűjtemények
HelloApplet.java
import java.awt.*;import javax.swing.*;
public class HelloApplet extends JApplet{ public void init( ) { ... } public void start( ) { ... }}
Más szerkezet. Nincs main metódus: az init metódust hívja a JDK appletviewer vagy a böngésző
HelloAndroid.java
public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}
Más osztály
Algoritmusok...
• Formálisan nehéz definiálni
• Algoritmuson olyan meghatározott számú lépésekből álló módszert, utasítás(sorozato)t, részletes útmutatást, receptet értünk, amely valamely felmerült probléma megoldására alkalmas.
• Például eljárást, algoritmust, receptet lehet adni egy bútor összeszerelésére, valamilyen étel, mondjuk paprikás krumpli
elkészítésének módjára, A legkisebb közös többszörös kiszámítására.
Eszközök az algoritmus leírására
• Pszeudokód Mesterséges formális nyelv amely változókból
és néhány állandó jelentésű szóból áll. Nem programozási nyelv, bár nagyon hasonlít
rá
• Folyamatábra A folyamat grafikus ábrázolása
Példa: számoljuk ki 12 + 22 + ... + n2
• Pszeudokód
Be: n
összeg = 0i = 1Ciklus amíg i n sq = i * i összeg = összeg + sq i = i + 1Ciklus vége
Ki: összeg
Példa
• Folyamatábra
n
összeg=0i = 1
i n ?
sq = i * iösszeg=összeg + sqi = i + 1
összeg
Nem
Igen
Input / output
Lépés végrehajtása
Döntés
Az első „igazi Bug”
Grace Hooper“(molylepke)
A relék között”
Mark II Aiken. Relé Calculator (Harvard University, 1945)
Változók
• Az algoritmusok változókkal dolgoznak
• A változók névvel rendelkező tárolók
• A változókat elképzelhetjük úgy is, mint egy palatáblát, amelyre a felírt értéket letörölhetjük és újat írhatunk rá
összeg = összeg+ sq
összeg
Az algoritmus néhány tulajdonsága
• Végesség: meghatározott lépésszám után fejeződjön be, vagy adjon eredményt.
• Tömörség: egy algoritmus ciklusokat, vagy rekurziót használhat, ugyanazon lépések többszörös végrehajtására.
• Általánosság: ne csak egy alkalomra legyen használható, hanem akkor is jó eredményt adjon, ha hasonló esetekre alkalmazzuk.
• Elvontság: egy algoritmus nem függ egy sajátos programozási nyelvtől vagy platformtól.
Be: n
összeg = 0i = 1Ciklus amíg i n sq = i * i összeg = összeg + sq i = i + 1Ciklus vége
Ki: összeg
Tulajdonságok (folytatás)
Compact: ugyanaz a kódhossz függetlenül n értékétől, köszönhetően a ciklusoknak. Az algoritmus ugyanazokat a lépéseket ismétli különböző lépésszámban, a változók különböző értékeire
(A “futási idő” természetesen függ n értékétől)
Általános: minden n-re
Tulajdonságok folyt.
function addSquares(n : integer) : integer; var i, sum : integer; begin sum := 0; for i := 1 to n do begin sum := sum + i * i end; addSquares := sum; end;
Elvont:PascalC/C++Java
public class MyMath{ public static int addSquares(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i * i; return sum; }}
int addSquares(int n){ int i, sum = 0; for (i = 1; i <= n; i++) sum += i * i; return sum;}
"
A Java primitív (elemi) adattípusai
• primitív típusok:
8 egyszerű típus számok, szövegek tárolására.
A többi típus objektum típus, amelyekre referenciák mutatnak
Név Leírás Értéktartomány Példák
byte Egész -128 – 127 (8bit)s 100, -52
short Egész -32.767 – 32.768 (16 bit)s
int Egész 32 bit s 42, -3, 0,
6394
long Egész 64 bit s
float Lebegőpontos 32 bit
double valós számok (10308) 64 bit 3.1,-0.25,
9.4e3
char karakterek 'a', 'X', '?', '\
n'
boolean logikai értékek true, false
Aritmetikai operátorok
• operátor: Műveleteket hajtanak végre.
+ összeadás - kivonás * szorzás / osztás % egészosztás maradéka
• A program futása közben ezek a kifejezések kiértékelődnek.
• A műveleteknek precedenciájuk (végrehajtási prioritásuk) van.
• A kifejezések kiértékelése balról jobbra halad azonos precedencia esetén.
• A precedencia zárójelek alkalmazásával módosítható.
Változók használata
• Értékek tárolására és kifejezésekben való használatra:
int x;x = 3;System.out.println("x értéke " + x); // x értéke 3
System.out.println(5 * x - 1); // 5 * 3 - 1
• A változók értéke felülírható:
int x;x = 3;System.out.println(x + " most"); // 3 most
x = 4 + 7;System.out.println("most x :" + x); // most x: 11
x 3x 11
Tömbök
• array: olyan objektum, amely sok azonos típusú változó tárolására szolgál. elem: Egy érték a tömbben. index: Egy egészszám, amely biztosítja a hozzáférést az értékhez.
index 0 1 2 3 4 5 6 7 8 9
value 12 49 -2 26 5 17 -6 84 72 3
Tömb deklarálása
típus[] név = new típus[hossz];
Például:
int[] szamok = new int[10];
index 0 1 2 3 4 5 6 7 8 9
value 0 0 0 0 0 0 0 0 0 0
Elemek hozzáférésenév[index] // hozzáférés
név[index] = érték; // módosítás
Példa:
szamok[0] = 27;szamok[3] = -6;
index 0 1 2 3 4 5 6 7 8 9
érték 27 0 0 -6 0 0 0 0 0 0
Különböző típusú tömbök
double[] eredmenyek = new double[5];eredmenyek[2] = 3.4;eredmenyek[4] = -0.5;
boolean[] tesztek = new boolean[6];tesztek[3] = true;
index 0 1 2 3 4
érték 0.0 0.0 3.4 0.0 -0.5
index 0 1 2 3 4 5
érték false false false true false false
Indexhatár túllépés
• Legális indexek: 0 és a tömb mérete – 1 között kell lennie. Ezen a határon kívüli index értékkel a tömb indexelése
ArrayIndexOutOfBoundsException kivételdobáshoz vezet.
• Példa:int[] data = new int[10];System.out.println(data[0]); // rendbenSystem.out.println(data[9]); // rendbenSystem.out.println(data[-1]); // kivételSystem.out.println(data[10]); // kivétel
index 0 1 2 3 4 5 6 7 8 9
value 0 0 0 0 0 0 0 0 0 0
Indexelésint[] szamok = new int[8];szamok[1] = 3;szamok[4] = 99;szamok[6] = 2;
int x = szamok[1];szamok[x] = 42;szamok[szamok[6]] = 11;
// használjuk szamok[6] értéket indexelésre
szamok
index 0 1 2 3 4 5 6 7
value 0 4 11 42 99 0 2 0
Tömbre vonatkozó korlátozások
• Egy létező tömb méretét nem változtathatjuk meg:
int[] a = new int[4];a.length = 10; // error
• Nem lehet összehasonlítani két tömböt a == vagy equals utasítással:
int[] a1 = {42, -7, 1, 15};int[] a2 = {42, -7, 1, 15};if (a1 == a2) { ... } // hiba!if (a1.equals(a2)) { ... } // hiba!
• Egy tömb nem tudja kiírni saját elemeit:
int[] a1 = {42, -7, 1, 15};System.out.println(a1); // [I@98f8c4]
The Arrays class
• A java.util csomag Arrays osztálya sok hasznos statikus medódust tartalmaz a tömbök kezelésére:
• Szintaxis: Arrays.metódusNév(paraméterek)
Metódus neve Leírás
binarySearch(tömb, érték) Egy rendezett tömbben megkeresi a megadott értéket és az érték indexével tér vissza ha megtalálta, ill. negatív értékkel, ha nem
copyOf(tömb, hossz) Egy tömb másolatával tér vissza
equals(tömb1, tömb2) Igaz értékkel tér vissza ha a tömb elemei rendről rendre megegyeznek
fill(tömb, érték) Minden elemet egy megadott értékre állít be
sort(tömb) Rendezi a tömb elemeit
toString(tömb) A tömb egyes elemeit szövegként adja vissza "[10, 30, -25, 17]"
Miből építkezhetünk?
• Szekvenciából: azaz az utasítások egymásutáni végrehajtásából. (pl. értékadás, eredménykiírás, számolás, függvényhívás)
• Elágazásokból: azaz a program egy bizonyos pontján más szekvenciális ág végrehajtásából.
• Ciklusokból: azaz ugyanazon szekvencia többszöri végrehajtásából.
Feltételes elágazás (if)
•Szekvencia (egymás utáni végrehajtás)
•Elágazás (alternatíva)
if (fizetes == 100000) { fizetes=110000; System.out.println("A fizetést megnöveltem"); } else { System.out.println("A fizetést nem növeltem meg"); }
Ha igaz a feltétel
Ha hamis a feltétel(elhagyható)
Többágú szelekció (switch)
switch (x)
{
case 1: System.out.println("A hét első napja, hétfő"); break;
case 2: System.out.println("Kedd");break;
case 3: System.out.println("Szerda");break;
case 4: System.out.println("Csütörtök");break;
case 5: System.out.println("Péntek, mindjárt hétvége!"); break;
case 6:
case 7: System.out.println("Hurrá, hétvége");break;
default: System.out.println("Nincs ilyen nap!!");
}
break – kilépünk, különben az összes utasítást a következő break-ig végrehajtja
i – sorszámozott típus (char, short, int)
Számláló ciklus
for (int i=2; i<=20; i=i+2)
{
System.out.println(i);
if (i==10) break;
}
Ciklusok break
cimke:for (int i=0; i < 5 ; i++){ for (int j = 1; j < 5; j++) { System.out.println ("i: " + i + ", j: " + j);
if (j==2) break; if (i == 3) break cimke; }}
Ciklusok folytatás (continue)
String szoveg = "egy kupac kopasz kukac";
int kszama = 0;
for (int i = 0; i < szoveg.length(); i++)
{
if (szoveg.charAt(i) != 'k') continue;
kszama++;
}
System.out.println(kszama+" k betű van a szövegben");
Ciklusok címkézett folytatás
kulso:for (int i=0; i < 5 ; i++){ for (int j = 1; j < 5; j++) { System.out.println("i: " + i + ", j: " + j); if (i==2) continue; if(j == 3) continue kulso; }}
!
For ciklus folyt.
int[] szamok = {1,2,3,24,51,62,17,28,9,10};
for (int elem : szamok)
{
System.out.println("Szám: " + elem);
}
Elöltesztelő ciklus (while)
String[] Nevek =
{"Joó Xénia","Nivák Rózsa","Kovács Andrea"};
int i;
String s;
i=0;
while (Nevek[i].startsWith("Nivák")==false)
{
i++;
}
System.out.println(Nevek[i]);
Hátultesztelő ciklus (do - while)
Scanner kbd = new Scanner(System.in);
int a;
do {
a=kbd.nextInt();
} while (a!=1);