Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 1/29
1/2 Abstraktní třída bývá používána jako nadtřída jiných tříd obsahující společné atributy a metody těchto tříd. Nemůžeme vytvořit instanci abstraktní třídy. Můžeme ale vytvořit instanci neabstraktní podtřídy. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 2/29
2/2 jsou deklarovány klíčovým slovem abstract. abstract class Vehicle { / / a b s t r a k t n i t r i d a class Car extends Vehicle { / / n e a b s t r a k t n i t r i d a Abstraktní třídu můžeme použít jako typ reference na instanci neabstraktní třídy. Vehicle a = new Car ( ) ; a. move( Vehicle.MOVE_UP) ; Nemůžeme vytvořit instanci abstraktní třídy. Vehicle b = new Vehicle ( ) ; / / Chyba p r i prekladu c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 3/29
Abstraktní metody 1/2 mohou obsahovat abstraktní metody. Tyto metody jsou označeny klíčovým slovem abstract a mají pouze hlavičku, tělo je nahrazeno ;. abstract class Vehicle { abstract i n t move ( i n t d i r e c t i o n ) ; / / a b s t r a k t n i m. Každá abstraktní metoda musí být implementována v neabstraktní třídě. class Car extends Vehicle { i n t move( i n t d i r e c t i o n ) { / / implementace c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 4/29
Abstraktní metody 2/2 Každá třída obsahující neimplementovanou abstraktní metodu (přímo nebo zděděnou) musí být deklarována jako abstraktní. Abstraktní metody jsou volány jako jiné metody - volána je implementace metody v podtřídě. Vehicle [ ] v e h i c l e s = new Vehicle [ 1 0 0 ] ; v e h i c l e s [ 0 ] = new Car ( ) ; v e h i c l e s [ 1 ] = new Truck ( ) ; for ( i n t i = 0 ; i < v e h i c l e s. l e n g t h ; i + + ) { / / volame metodu move ( ) p r i s l u s n e t r i d y v e h i c l e s [ i ]. move (MOVE_UP) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 5/29
1/6 je pojmenovaná kolekce deklarací metod. V rozhraní můžeme rovněž deklarovat konstanty. Definice rozhraní se podobá definici třídy, ale místo klíčového slova class používáme klíčové slovo interface. interface Moveable { i n t move( i n t d i r e c t i o n ) ; / / metoda i n t MOVE_UP = 0 ; / / konstanty Definice metod je jako definice abstraktních metod až na vynechání klíčového slova abstract. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 6/29
Rozhraní 2/6 Úvod do programovacích jazyků (Java), 7 Pokud třída poskytuje implementaci metod rozhraní, říkáme že třída implementuje rozhraní. class Car implements Moveable { public i n t move ( i n t d i r e c t i o n ) { / / implementace metody r o z h r a n i c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 7/29
Rozhraní 3/6 Úvod do programovacích jazyků (Java), 7 Reference, která ukazuje na objekt implementující dané rozhraní může být použita stejně jako reference na instanci. Car c = new Car ( ) ; Moveable m = c ; m. move(move_up) ; m. randommove ( ) ; / / chyba prekladu / / randommove ( ) neni deklarovana / / v r o z h r a n i Moveable Můžeme volat pouze metody deklarované v rozhraní. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 8/29
Rozhraní 4/6 Úvod do programovacích jazyků (Java), 7 Rozhraní definuje protokol chování, které může být implementováno libovolnou třídou v hierarchii tříd. Rozhraní deklaruje množinu metod, ale neimplementuje tyto metody. Třída implementující rozhraní musí implementovat všechny metody rozhraní. Můžeme vytvořit hierarchii rozhraní podobnou hierarchii tříd Mluvíme o nad-rozhraní (superinterfaces) a pod-rozhraní (subinterfaces). interface Flyable extends Moveable { void s e t A l t i t u d e ( double a l t i t u d e ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 9/29
5/6 Třída může implementovat více než jedno rozhraní. Jména různých rozhraní jsou oddělena,. class H o v e r c r a f t Car implements Movable, Flyable { Metody deklarované v rozhraní jsou implicitně public a abstract. Není možné toto změnit. Atributy deklarované v rozhraní jsou implicitně public, static a final. Jedná se tedy o konstanty. Není možné toto změnit. Když třída implementuje rozhraní, musí implementovat všechny metody nebo musí být deklarována jako abstraktní. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 10/29
Rozhraní 6/6 Úvod do programovacích jazyků (Java), 7 Rozhraní vs Abstraktní třída Rozhraní neimplementuje metody, zatímco abstraktní třída může. Rozhraní nemůže deklarovat statické metody, zatímco abstraktní třída může. Rozhraní nemůže deklarovat instanční proměnné, zatímco abstraktní třída může. Rozhraní nemůže deklarovat statické proměnné které nejsou final, zatímco abstraktní třída může. Třída může implementovat více rozhraní, ale může dědit z nejvýše jedné třídy. Rozhraní není součástí hierarchie tříd, libovolná třída může implementovat stejné rozhraní. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 11/29
1/3 jsou deklarovány klíčovým slovem final. f i n a l i n t MOVE_UP = 1 ; Hodnota takto deklarované konstantě může být přiřazena pouze při deklaraci. V případě instační proměnné také v konstruktoru. Pokud se pokusíme přiřadit hodnotu na jiném místě, překladač nahlásí chybu. MOVE_UP = 1 0 ; / / Chyba p r i prekladu často deklarujeme jako třídní (static), v tomto případě existuje pouze jedna kopie pro všechny instance. s t a t i c f i n a l i n t NUMBER = 1 0 ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 12/29
2/3 Konvence: Jména konstant zapisujeme velkýmy znaky a znaky _. Často používaným případem použití konstant je reprezentace konečné množiny hodnot. Každému prvku množiny je přiřazeno celé číslo celočíselná konstanta. V kódu používáme názvy deklarovaných konstant místo celočíselných hodnot. Vyvarujeme se možných chyb a kód získá na čitelnosti. c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 13/29
3/3 Konvence: konstanty se stejné množiny mají společný prefix. / / smer pohybu v o z i d l a v CarGame public f i n a l s t a t i c i n t DIRECTION_UP = 0, DIRECTION_DOWN = 1, DIRECTION_LEFT = 2, DIRECTION_RIGHT = 3 ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 14/29
Rozhraní, příklad 1/2 Rozhraní Enumeration z Java API slouží pro iteraci prvky datové struktury. public interface Enumeration { boolean hasmoreelements ( ) ; Object nextelement ( ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 15/29
Rozhraní, příklad 2/2 import java. u t i l. ; public s t a t i c void main ( S t r i n g args [ ] ) { Vector v = new Vector ( ) ; v. add (new I n t e g e r ( 1 ) ) ; v. add (new Double ( 2. 2 ) ) ; v. add (new I n t e g e r ( 3 ) ) ; for ( Enumeration e = v. elements ( ) ; e. hasmoreelements ( ) ; ) { System. out. p r i n t l n ( e. nextelement ( ) ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 16/29
, příklad CarGame, Vehicle.java 1/4 / Vehicle. java Vozidlo. Michal Kratky 19.11.2006 / package cargame ; public abstract class Vehicle { i n t mx = 0, my = 0 ; / / pozice GameArea mgamearea ; / / ukazatel na h r a c i pole c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 17/29
, příklad CarGame, Vehicle.java 2/4 public f i n a l s t a t i c i n t DIRECTION_UP = 0, DIRECTION_DOWN = 1, DIRECTION_LEFT = 2, DIRECTION_RIGHT = 3 ; public f i n a l s t a t i c i n t MOVE_LEGAL = 0, MOVE_OUT = 1, MOVE_CRASH = 2, MOVE_UNSUPPORTED = 3 ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 18/29
, příklad CarGame, Vehicle.java 3/4 public Vehicle ( i n t x, i n t y, GameArea gamearea ) { public Vehicle ( ) { public i n t getx ( ) { return mx; public i n t gety ( ) { return my; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 19/29
, příklad CarGame, Vehicle.java 4/4 / / Nahodny pohyb v o z i d l a o jednu p o z i c i. public i n t RandomMove ( ) { / / Pohyb v o z i d l a ve smeru o jednu p o z i c i. public i n t Move ( i n t d i r e c t i o n ) { abstract void p r i n t ( ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 20/29
, příklad CarGame, Car.java 1/1 package cargame ; public class Car extends Vehicle { public Car ( i n t x, i n t y, GameArea gamearea ) { mgamearea = gamearea ; mx = x ; my = y ; public Car ( ) { void p r i n t ( ) { System. out. p r i n t ( # ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 21/29
, příklad CarGame, Truck.java 1/3 package cargame ; public class Truck extends Vehicle { i n t mlight ; public s t a t i c f i n a l i n t LIGHT_NONE = 0, LIGHT_RED = 1, LIGHT_BLUE = 2 ; public Truck ( i n t x, i n t y, GameArea gamearea ) { super ( x, y, gamearea ) ; mlight = LIGHT_NONE ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 22/29
, příklad CarGame, Truck.java 2/3 / / nastav nahodne s v e t l o auta public void setrandomlight ( ) { / / nastav s v e t l o auta public void s e t L i g h t ( i n t l i g h t ) { public i n t g e t L i g h t ( ) { c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 23/29
, příklad CarGame, Truck.java 3/3 public void p r i n t ( ) { char symbol = o ; i f ( mlight = = LIGHT_RED) { symbol = R ; else i f ( mlight = = LIGHT_BLUE) { symbol = B ; System. out. p r i n t ( symbol ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 24/29
, příklad CarGame, GameArea.java 1/4 package cargame ; public class GameArea { i n t mwidth, mheight ; / / s i r k a a vyska pole Vehicle marea [ ] [ ] ; / / h r a c i pole public GameArea ( i n t width, i n t h e i g h t ) { mwidth = width ; mheight = h e i g h t ; marea = new Vehicle [ width ] [ h e i g h t ] ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 25/29
, příklad CarGame, GameArea.java 2/4 i n t Move( Vehicle vehicle, i n t oldx, i n t oldy, i n t newx, i n t newy ) { i n t move = set (newx, newy, v e h i c l e ) ; i f ( move = = Vehicle.MOVE_LEGAL ) { marea [ oldx ] [ oldy ] = null ; return move ; public Vehicle get ( i n t x, i n t y ) { return marea [ x ] [ y ] ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 26/29
, příklad CarGame, GameArea.java 3/4 public i n t set ( i n t x, i n t y, Vehicle v e h i c l e ) { i n t move = MOVE_LEGAL; i f ( x >= 0 && x < mheight && y >=0 && y < mwidth ) { i f ( get ( x, y )! = null ) { move = MOVE_CRASH ; else { marea [ x ] [ y ] = v e h i c l e ; else { move = Vehicle.MOVE_OUT ; return move ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 27/29
, příklad CarGame, GameArea.java 4/4 public void p r i n t ( ) { / / V y t i s k n i pole System. out. p r i n t ( "GameArea : \ n " ) ; for ( i n t i = mheight 1 ; i > = 0 ; i ) { System. out. p r i n t ( " " ) ; for ( i n t j = 0 ; j < mwidth ; j + + ) { i f ( get ( i, j ) = = null ) { System. out. p r i n t ( " " ) ; else { get ( i, j ). p r i n t ( ) ; System. out. p r i n t ( " \ n " ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 28/29
, příklad CarGame, CarGame.java 1/1 public void Run ( ) { / / v y t v o r h r a c i pole a pole v o z i d e l GameArea gamearea = new GameArea ( 1 0, 1 0 ) ; Vehicle vs [ ] = new Vehicle [NUMBER_OF_CARS ] ; / / v y t v o r dve auta a poloz j e do hraciho pole vs [ 0 ] = new Car ( 4, 4, gamearea ) ; gamearea. set ( vs [ 0 ]. getx ( ), vs [ 0 ]. gety ( ), vs [ 0 ] ) ; vs [ 2 ] = new Truck ( 8, 8, gamearea ) ; gamearea. set ( vs [ 2 ]. getx ( ), vs [ 2 ]. gety ( ), vs [ 2 ] ) ; c 2006 Michal Krátký Úvod do programovacích jazyků (Java) 29/29