Programozási nyelvek II.: JAVA

Hasonló dokumentumok
Programozási nyelvek Java

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozási nyelvek II.: JAVA

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Collections. Összetett adatstruktúrák

Programozási nyelvek Java

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

és az instanceof operátor

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozási nyelvek Java

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Programozási nyelvek II.: JAVA, 11. gyakorlat

Abstract osztályok és interface-ek. 7-dik gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java programozási nyelv 4. rész Osztályok II.

Generikus Típusok, Kollekciók

Programozási nyelvek II.: JAVA, 4. gyakorlat

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Osztálytervezés és implementációs ajánlások

Programozási technológia

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Osztálytervezés és implementációs ajánlások

Objektumorientált programozás Java-ban

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

JAVA PROGRAMOZÁS 3.ELŐADÁS

Java programozási nyelv 5. rész Osztályok III.

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Segédanyag: Java alkalmazások gyakorlat

Szoftvertechnolo gia gyakorlat

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Programozási nyelvek II.: JAVA, 4. gyakorlat

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP #14 (referencia-elv)

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Programozási technológia

Programozás I. Első ZH segédlet

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C# osztályok. Krizsán Zoltán

Globális operátor overloading

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Gyakorlás

ZH mintapélda. Feladat. Felület

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

BME MOGI Gépészeti informatika 8.

3. Osztályok II. Programozás II

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Osztályok. 4. gyakorlat

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Objektumok inicializálása

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Segédanyag: Java alkalmazások gyakorlat

Java felhasználói felület

Magas szintű programozási nyelvek 2 Előadás jegyzet

Bánsághi Anna

C#, OOP. Osztályok tervezése C#-ban

Programozási nyelvek II.: JAVA

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Web-technológia PHP-vel

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Java és web programozás

Generikus osztályok, gyűjtemények és algoritmusok

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java és web programozás

Java III. I I. Osztálydefiníció (Bevezetés)

Java III. I I. Osztálydefiníció (Bevezetés)

Java programozási nyelv

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozási technológia

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Java és web programozás

Segédanyag: Java alkalmazások gyakorlat

Java VII. Polimorfizmus a Java nyelvben

Programozás II gyakorlat. 8. Operátor túlterhelés

Java Programozás 3. Gy: Java GUI. Swing, AWT

Programozási nyelvek Java

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

Elemi Alkalmazások Fejlesztése II.

Programozási nyelvek II.: JAVA

4. Gy: JAVA osztályok

7. K: JAVA alapok Konzultáció

Java és web programozás

OOP: Java 7.Gy: Öröklődés, referenciák

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Programozási nyelvek Java

Programozás II. 4. Dr. Iványi Péter

Java VII. Polimorfizmus a Java nyelvben

Objektumorientált programozás C# nyelven

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Átírás:

Programozási nyelvek II.: JAVA 13. gyakorlat 2017. december 11-15. 13. gyakorlat Programozási nyelvek II.: JAVA 1 / 32

Az 13. gyakorlat tematikája Generikus típusokés öröklődés Clone Comparator Névtelen osztály, és lambda kifejezés 13. gyakorlat Programozási nyelvek II.: JAVA 2 / 32

Generikus típus - ismétlés "típussal paraméterezett típus" példa egyszerű csomagoló osztály generikusok nélkül: public class Box { private Object object ; public void set ( Object object ) { this. object = object ; public Object get () { return object ; 13. gyakorlat Programozási nyelvek II.: JAVA 3 / 32

Generikus típus - ismétlés Problémák: akármilyen nem primitív típusú objektumot tárolhat -> ha vissza akarjuk kapni az eredeti típusos objektumunkat castolni kell ha tévedésből más típusú objektumot adunk oda neki a castolás futásidejű kivételt eredményez, amit aztán nehéz lenyomozni 13. gyakorlat Programozási nyelvek II.: JAVA 4 / 32

Generikus típus - ismétlés Megoldás: fordítási idejű ellenőrzés - generikusok public class Box <T > { // T stands for "Type" private T t; public void set ( T t) { this. t = t; public T get () { return t; //használat: Box < Integer > integerbox = new Box < >(); 13. gyakorlat Programozási nyelvek II.: JAVA 5 / 32

Generikus metódusok hasonlóan az osztályokhoz, a generikus paraméter hatása csak metódusra terjed ki. Lehetnek generikus metódusok static és nem static függvények vagy konstruktorok is. Szintaxis: a visszatérédi érték előtt <...> -ben jelölni a típusparamétereket Példa public class Util { public static <K, V > boolean compare ( Pair <K, V > p1, Pair <K, V> p2) { return p1. getkey (). equals (p2. getkey ()) && p1. getvalue (). equals (p2. getvalue ()); 13. gyakorlat Programozási nyelvek II.: JAVA 6 / 32

Megszorítások típusparaméterekre megkötések generikus osztályunk által kezelt típusokra például: szeretnénk egy adott tömbben egy küszöbértéknél "nagyobb elemelet megszámlálni: public interface Comparable <T > { public int compareto ( T o); public static <T extends Comparable <T >> int countgreaterthan ( T[] anarray, T elem ) { int count = 0; for ( T e : anarray ) if (e. compareto ( elem ) > 0) ++ count ; return count ; Egyszerre több megkötés is alkalmazható: <T extends B1 & B2 & B3>, ekkor a paraméternek az összes paraméter altípusának kell lennie egyszerre. 13. gyakorlat Programozási nyelvek II.: JAVA 7 / 32

Generics - praktikus szabályok típusmegszorításnál extends leszármaztatás megszorított típusparaméterű generikus típusból: pinterface Edge { int getsource (); int gettarget (); abstract class Graph <E extends Edge > {... class SparseGraph <E extends Edge > extends Graph <E > {... 13. gyakorlat Programozási nyelvek II.: JAVA 8 / 32

Beágyazott osztályok közelebb vinni a segédosztályt a használat helyéhez azt akarjuk hogy az egyik (beágyazott) hozzávérhessen a másik private-nak szánt adattagjaihoz osztályok bármilyen blokkon belül definiálhatóak 13. gyakorlat Programozási nyelvek II.: JAVA 9 / 32

Névtelen osztályok osztály deklarálása és példányosítása egyidőben úgy néz ki a mintha interfészt példányosítanánk 13. gyakorlat Programozási nyelvek II.: JAVA 10 / 32

Névtelen osztályok public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet (); public void greetsomeone ( String someone ); //... 13. gyakorlat Programozási nyelvek II.: JAVA 11 / 32

Névtelen osztályok beágyazott osztály public void sayhello () { 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 (); englishgreeting. greet (); //... 13. gyakorlat Programozási nyelvek II.: JAVA 12 / 32

Névtelen osztályok névtelen osztály //... 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 ); ; frenchgreeting. greetsomeone (" Fred "); 13. gyakorlat Programozási nyelvek II.: JAVA 13 / 32

Lamba kifejezések Ha a névtelen osztályunk valami nagyon egyszerű dolgot implementál, például ha mindössze egy metódussal rendelkezik, és a gyakorlatban ezem metódus variálgatására szolgálnak a definiált osztályok, akkor a fentebb mutatott viszonylag tömör típusleírás is feleslegesnek tűnhet. tulajdonképpen metódusokat szeretnénk átadni egy másik eljárás paramétereként A Lambda kifejezések lényege, hogy lehetővé teszik tehát metódusok paraméterként történő átadását illetve a kód adatként való kezelését. Példa: szeretnénk minél szélesebb körben használható szűrési metódust írni amely Person típusú objektumok valamely tulajdonságát vizsgálja, majd a teszten átment objektumokat kiírja. 13. gyakorlat Programozási nyelvek II.: JAVA 14 / 32

Lamba kifejezések - metódus átadása 1. Tester osztállyal/lokális osztállyal class CheckWithInnerClass { interface CheckPerson { boolean test ( Person p ); class Checker implements CheckPerson { public boolean test ( Person p) { return p. gender == Person. Sex. MALE && p. getage () >= 18 && p. getage () <= 25; public static void printpersons ( List < Person > roster, CheckPerson tester ) { for ( Person p : roster ) { if ( tester. test (p)) p. printperson (); public static void main ( String [] args ){ printpersons ( roster, new Checker ()); 13. gyakorlat Programozási nyelvek II.: JAVA 15 / 32

Lamba kifejezések - metódus átadása 2. Névtelen osztállyal //... printpersons ( roster, new CheckPerson () { public boolean test ( Person p) { return p. getgender () == Person. Sex. MALE && p. getage () >= 18 && p. getage () <= 25; ); 3. Lambda kifejezéssel //... printpersons ( roster, ( Person p) -> p. getgender () == Person. Sex. MALE && p. getage () >= 18 && p. getage () <= 25 ); 13. gyakorlat Programozási nyelvek II.: JAVA 16 / 32

Lamba kifejezések - szintaktika (<inputtípus1 input1>,...,<inputtípus1 input1>) a megvalósított interfész egyetlen metódusának paraméterei a típusnevek lehagyhatók zárójel is lehagyható, amennyiben csak egy paraméter lesz ( (Person p) helyett p ) -> a nyíl token a metódus törzse, melynek vagy egyetlen kifejezésből kell állnia, vagy egy blokknak kell lennie (... ) 13. gyakorlat Programozási nyelvek II.: JAVA 17 / 32

Lamba kifejezések - példák p -> p. getgender () == Person. Sex. MALE && p. getage () >= 18 && p. getage () <= 25 ha blokkot használunk szükség van a return használatára p -> { return p. getgender () == Person. Sex. MALE && p. getage () >= 18 && p. getage () <= 25; 13. gyakorlat Programozási nyelvek II.: JAVA 18 / 32

Lamba kifejezések - példa Még egy példa: public class Calculator { interface IntegerMath { int operation ( int a, int b); public int operatebinary ( int a, int b, IntegerMath op) { return op. operation (a, b); public static void main ( String... args ) { Calculator myapp = new Calculator (); IntegerMath addition = (a, b) -> a + b; IntegerMath subtraction = (a, b) -> a - b; System. out. println ("40 + 2 = " + myapp. operatebinary (40, 2, addition )); System. out. println ("20-10 = " + myapp. operatebinary (20, 10, subtraction )); 13. gyakorlat Programozási nyelvek II.: JAVA 19 / 32

Lamba kifejezések -Comparator Listák rendezése: java.util.collections.sort statiku smetódussal: 1. Comparable<T> -t megvalósító T osztályokat tároló listák: sort(list<t> list) class Person implements Comparable < Person >{... //... List < Person > l = new ArrayList < >(); //... Collections. sort (l); //.. 13. gyakorlat Programozási nyelvek II.: JAVA 20 / 32

Lamba kifejezések -Comparator 2. Listákra általában: sort(list<t> list, Comparator<? super T> c) - ahol a Comparator egy úgynevezett funkcionális interfész, azaz csak egy meghatározott metódust meglétét deklarálja: int compare (T o1,t o2) metódus megadása: névtelen osztállyal: class Car {... //... List < Car > l = new ArrayList < >(); //... Comparator < Car > byname = new Comparator < Car >() { @Override public int compare ( Car c1, Car c2) { return c1. getname (). compareto (c2. getname ()); ; Collections. sort (l, byname ); //.. 13. gyakorlat Programozási nyelvek II.: JAVA 21 / 32

Lamba kifejezések -Comparator 2. Listákra általában: sort(list<t> list, Comparator<? super T> c) - ahol a Comparator egy úgynevezett funkcionális interfész, azaz csak egy meghatározott metódust meglétét deklarálja: int compare (T o1,t o2) metódus megadása: lambda kifejezéssel: class Car {... //... List < Car > l = new ArrayList < >(); //... Collections. sort (l, (c1,c2)->c1. getname (). compareto (c2. getname ()) ); //.. 13. gyakorlat Programozási nyelvek II.: JAVA 22 / 32

Clone Objektumok duplikálására szolgál azaz új objektumot hozunk létre, amelynek összes adattagja megegyezik az eredeti értékeivel. követelmények: i) mc. clone ()!= mc ii) mc. getclass () == mc. clone (). getclass () iii ) mc. clone (). equals (mc) Hogyan: clone() metódus megvalósítása Cloneable interface implementáló osztály - DE ez egy marker/jelölő interface -> nem kényszeríti ki a clone() implementálását, mindazonáltal jelzi a compiuler és a JVM felé, hogy az osztály clone() metódusát meg lehet hívni CloneNotSupportedException : clone() metódust írhatunk bármilyen osztályhoz, azonban ha az osztály amit klónozni akarunk nincs 13. gyakorlat Cloneable-nek definiálni Programozási az említett nyelvek exception II.: JAVAfog dobódni. 23 / 32

Clone Hogy is néz ez ki? public class CloneTrial implements Cloneable { int i; XYZ xyz = new XYZ (); public CloneTrial clone () throws CloneNotSupportedExcep CloneTrial ct = ( CloneTrial ) super. clone (); return ct; public static void main ( String [] x) throws CloneNotSupp CloneTrial ct = new CloneTrial (); ct = ct. clone (); class XYZ { int x,y,z; 13. gyakorlat Programozási nyelvek II.: JAVA 24 / 32

Sekély másolás/shallow copy Mi történik mikor klónozunk? "Bitenkénti másolás", azaz minden mező lemásolódik ugyanazzal az értékkel, ami az eredetiben található. //.. public static void main ( String [] x) throws CloneNotSupporte CloneTrial ct = new CloneTrial (); CloneTrial ct1 = ct. clone (); ct.xyz.x = 1; System. out. println ( ct1. xyz.x); // OUTPUT : 1 Következmény: a referenciák is bitenként másolódnak, azaz ugyanarra az objektumra fognak mutatni. Ezt hívjuk sekély másolásnak 13. gyakorlat Programozási nyelvek II.: JAVA 25 / 32

Mély másolás/deep copy Azt akarjuk,hogy a logikailag az objektumhoz tartozó másik objektumok állapota védve legyen, azaz a beágyazott objektumok is lemásolódjanak. Ehhez osztályonként definiálnunk kell a metódust, mit akarunk érték és mit referencia szerint átadni. //.. public static void main ( String [] x) throws CloneNotSupportedException { CloneTrial ct = new CloneTrial (); CloneTrial ct1 = ct. clone (); ct.xyz.x = 1; System. out. println ( ct1. xyz.x); // OUTPUT : 1 Következmény: a referenciák is bitenként másolódnak, azaz ugyanarra az objektumra fognak mutatni. Ezt hívjuk sekély másolásnak 13. gyakorlat Programozási nyelvek II.: JAVA 26 / 32

Mély másolás/deep copy Az előző program mély másolással : XYZ típusú objektum is lemásolva Ehhez osztályonként definiálnunk kell a metódust, mit akarunk érték és mit referencia szerint átadni. 1. próba public class CloneTrial implements Cloneable { int i; XYZ xyz = new XYZ (); public CloneTrial clone () throws CloneNotSupportedException { CloneTrial ct = ( CloneTrial ) super. clone (); ct.xyz = ( XYZ )ct.xyz. clone (); return ct; class XYZ { int x,y,z; fordítási hiba: a clone() protectednek van deklarálva az Objectben(XYZ) definiáljuk felül! 13. gyakorlat Programozási nyelvek II.: JAVA 27 / 32

Mély másolás/deep copy 2. próba - clone felüldefiniálása //... class XYZ { int x,y,z; public XYZ clone () throws CloneNotSupportedException { return ( XYZ ) super. clone (); CloneNotSupportedException : nincs Cloneable-nek definiálva XYZ 13. gyakorlat Programozási nyelvek II.: JAVA 28 / 32

Mély másolás/deep copy 3. próba - Cloneable interfész //... class XYZ implements Cloneable { int x,y,z; public XYZ clone () throws CloneNotSupportedException { return ( XYZ ) super. clone (); Most már rendben van: ouput :0 13. gyakorlat Programozási nyelvek II.: JAVA 29 / 32

Feladat - hibajavítás - clone() javítsuk ki a következő hibás programot! bathroom.zip javítsuk ki a fordítási hibákat! implementáljunk a mély másolást a BathRoom.java clone() metódusának kijavításával, azaz érjük el, hogy a klónozás során a BathTub objektum is lemásolásra kerüljön! 13. gyakorlat Programozási nyelvek II.: JAVA 30 / 32

Feladat 1 Induljuk ki a következő programból: Ember.java BeolvasEmber.java input.txt a).rendezzük az emberek listáját név szerint. a rendezéshez használd a Collections.sort metódust az Ember osztály valósítsa meg a Comparable<Ember> interfészt b). Rendezzük az emberek listáját azonosító szerint (de úgy, hogy név szerint továbbra is rendezhető maradjon) I. megoldás: Comparator osztály és a Comparator-paraméteres Collections.sort metódus használatával II. megoldás: ugyanez névtelen Comparator osztállyal II. megoldás: ugyanez lambda függvénnyel 13. gyakorlat Programozási nyelvek II.: JAVA 31 / 32

Feladat 2 Gyakoroljuk a lambda függvényeket! Készítsünk egy List objektumot, amit töltsünk fel 10 véletlenszerű számmal. Lambda függvények segítségével végezzük el a listán a következő feladatokat: a). list.foreach segítségével: Írjuk ki a lista elemeit Tegyük át a lista elemeit egy halmazba Végezzük el mindkét feladatot egyszerre b). list.removeif segítségével: távolítsuk el a listából a 10-nél nagyobb számokat. c). list.replaceall segítségével: emeljük négyzetre a számokat. 13. gyakorlat Programozási nyelvek II.: JAVA 32 / 32