Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Úvod do programovacích jazyku˚ (Java) Michal Krátký Katedra informatiky VŠB–Technická univerzita Ostrava
Úvod do programovacích jazyku˚ (Java), 2006/2007
c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
1/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy 1/2
Abstraktní tˇrída bývá používána jako nadtˇrída jiných tˇríd ˇ obsahující spoleˇcné atributy a metody techto tˇríd. Nemužeme ˚ vytvoˇrit instanci abstraktní tˇrídy. Mužeme ˚ ale vytvoˇrit instanci neabstraktní podtˇrídy.
c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
2/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy 2/2 Abstraktní tˇrídy jsou deklarovány klíˇcovým slovem abstract. a b s t r a c t class V e h i c l e { / / a b s t r a k t n i t r i d a ... } class Car extends V e h i c l e { / / n e a b s t r a k t n i t r i d a ... } Abstraktní tˇrídu mužeme ˚ použít jako typ reference na instanci neabstraktní tˇrídy. V e h i c l e a = new Car ( ) ; a . move ( V e h i c l e .MOVE_UP ) ; Nemužeme ˚ vytvoˇrit instanci abstraktní tˇrídy. V e h i c l e b = new V e h i c l e ( ) ; / / Chyba p r i p r e k l a d u c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
3/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní metody 1/2 Abstraktní tˇrídy mohou obsahovat abstraktní metody. Tyto metody jsou oznaˇceny klíˇcovým slovem abstract a mají ˇ je nahrazeno ;. pouze hlaviˇcku, telo a b s t r a c t class V e h i c l e { ... a b s t r a c t 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ˇríde. class Car extends V e h i c l e { ... 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 jazyku˚ (Java)
4/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní metody 2/2 Každá tˇrída obsahující neimplementovanou abstraktní metodu ˇ enou) ˇ (pˇrímo nebo zded musí být deklarována jako abstraktní. Abstraktní metody jsou volány jako jiné metody - volána je ˇ implementace metody v podtˇríde. V e h i c l e [ ] v e h i c l e s = new V e h i c l e [ 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 ( int i = 0 ; i < vehicles . length ; 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 jazyku˚ (Java)
5/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní (interface) 1/6 Rozhraní (interface) je pojmenovaná kolekce deklarací metod. ˇ deklarovat konstanty. V rozhraní mužeme ˚ rovnež Definice rozhraní se podobá definici tˇrídy, ale místo klíˇcového slova class používáme klíˇcové slovo interface. i n t e r f a c e Moveable { i n t move ( i n t d i r e c t i o n ) ; / / metoda i n t MOVE_UP = 0 ; / / k o n s t a n t y ... } Definice metod je jako definice abstraktních metod až na vynechání klíˇcového slova abstract. c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
6/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní 2/6 Pokud tˇrída poskytuje implementaci metod rozhraní, ˇríkáme že tˇrí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 jazyku˚ (Java)
7/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní 3/6 Reference, která ukazuje na objekt implementující dané rozhraní muže ˚ být použita stejneˇ jako reference na instanci. Car c = new Car ( ) ; ... Moveable m = c ; m. move (MOVE_UP ) ; m. randomMove ( ) ; / / chyba p r e k l a d u / / randomMove ( ) n e n i deklarovana / / v r o z h r a n i Moveable Mužeme ˚ volat pouze metody deklarované v rozhraní.
c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
8/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní 4/6 Rozhraní definuje protokol chování, které muže ˚ být implementováno libovolnou tˇrídou v hierarchii tˇríd. Rozhraní deklaruje množinu metod, ale neimplementuje tyto metody. Tˇrída implementující rozhraní musí implementovat všechny metody rozhraní. Mužeme ˚ vytvoˇrit hierarchii rozhraní podobnou hierarchii tˇríd Mluvíme o nad-rozhraní (superinterfaces) a pod-rozhraní (subinterfaces). i n t e r f a c e F l y a b l e 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 jazyku˚ (Java)
9/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní (interface) 5/6 Tˇrída muže ˚ implementovat více než jedno rozhraní. Jména ˇ ruzných ˚ rozhraní jsou oddelena ,. class H o v e r c r a f t Car implements Movable , F l y a b l e { ... Metody deklarované v rozhraní jsou implicitneˇ public a ˇ abstract. Není možné toto zmenit. Atributy deklarované v rozhraní jsou implicitneˇ public, static a final. Jedná se tedy o konstanty. Není možné ˇ toto zmenit. Když tˇrí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 jazyku˚ (Java)
10/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní 6/6 Rozhraní vs Abstraktní tˇrída Rozhraní neimplementuje metody, zatímco abstraktní tˇrída muže. ˚ Rozhraní nemuže ˚ deklarovat statické metody, zatímco abstraktní tˇrída muže. ˚ ˇ Rozhraní nemuže ˚ deklarovat instanˇcní promenné, zatímco abstraktní tˇrída muže. ˚ ˇ Rozhraní nemuže ˚ deklarovat statické promenné které nejsou final, zatímco abstraktní tˇrída muže. ˚ ˇ z Tˇrída muže ˚ implementovat více rozhraní, ale muže ˚ dedit nejvýše jedné tˇrídy. Rozhraní není souˇcástí hierarchie tˇríd, libovolná tˇrída muže ˚ implementovat stejné rozhraní. c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
11/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Konstanty 1/3 Konstanty jsou deklarovány klíˇcovým slovem final. f i n a l i n t MOVE_UP = 1 ; Hodnota takto deklarované konstanteˇ muže ˚ být pˇriˇrazena ˇ pouze pˇri deklaraci. V pˇrípadeˇ instaˇcní promenné také v konstruktoru. ˇ Pokud se pokusíme pˇriˇradit hodnotu na jiném míste, pˇrekladaˇc nahlásí chybu. MOVE_UP = 1 0 ;
/ / Chyba p r i p r e k l a d u
Konstanty cˇ asto deklarujeme jako tˇrídní (static), v tomto pˇrípadeˇ 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 jazyku˚ (Java)
12/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Konstanty 2/3
Konvence: Jména konstant zapisujeme velkýmy znaky a znaky _. ˇ Casto používaným pˇrípadem použití konstant je reprezentace koneˇcné množiny hodnot. Každému prvku množiny je pˇriˇrazeno celé cˇ íslo – celoˇcíselná konstanta. V kódu používáme názvy deklarovaných konstant místo celoˇcíselných hodnot. Vyvarujeme se možných chyb a kód získá na cˇ itelnosti.
c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
13/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Konstanty 3/3
Konvence: konstanty se stejné množiny mají spoleˇcný 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 jazyku˚ (Java)
14/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní, pˇríklad 1/2
Rozhraní Enumeration z Java API slouží pro iteraci prvky datové struktury. public i n t e r f a c e Enumeration { boolean hasMoreElements ( ) ; O b j e c t nextElement ( ) ; }
c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
15/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Rozhraní, pˇríklad 2/2 import j a v a . u t i l . ∗ ; ... public s t a t i c void main ( S t r i n g args [ ] ) { V e c t o r v = new V e c t o r ( ) ; 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 ) ) ; f o r ( Enumeration e = v . elements ( ) ; e . hasMoreElements ( ) ; ) { System . o u t . p r i n t l n ( e . nextElement ( ) ) ; } } } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
16/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, Vehicle.java 1/4 /∗ ∗ Vehicle . java ∗ Vozidlo . ∗ Michal Kratky ∗ 19.11.2006 ∗/ package carGame ; public a b s t r a c t class V e h i c l e { i n t mX = 0 , mY = 0 ; / / p o z i c e GameArea mGameArea ; / / u k a z a t e l na h r a c i p o l e c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
17/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇrí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 jazyku˚ (Java)
18/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, Vehicle.java 3/4 public V e h i c l e ( i n t x , i n t y , GameArea gameArea ) { ... } public V e h i c l e ( ) { } public i n t getX ( ) { r e t u r n mX; } public i n t getY ( ) { r e t u r n mY; } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
19/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇrí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 ) { ... } a b s t r a c t void p r i n t ( ) ; } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
20/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, Car.java 1/1 package carGame ; public class Car extends V e h i c l e { 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 . o u t . p r i n t ( ’ # ’ ) ; } } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
21/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, Truck.java 1/3 package carGame ; public class Truck extends V e h i c l e { 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 , super ( x , y , gameArea ) ; mLight = LIGHT_NONE ; } c
2006
Michal Krátký
GameArea gameArea ) {
Úvod do programovacích jazyku˚ (Java)
22/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇrí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 jazyku˚ (Java)
23/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇrí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 . o u t . p r i n t ( symbol ) ; } } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
24/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, GameArea.java 1/4 package carGame ; public class GameArea { i n t mWidth , mHeight ; V e h i c l e mArea [ ] [ ] ;
/ / s i r k a a vyska p o l e / / h r a c i pole
... public GameArea ( i n t width , i n t h e i g h t ) { mWidth = w i d t h ; mHeight = h e i g h t ; mArea = new V e h i c l e [ w i d t h ] [ h e i g h t ] ; } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
25/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, GameArea.java 2/4 i n t Move ( V e h i c l e v e h i c l e , i n t oldX , i n t oldY , i n t newX , i n t newY ) { i n t move = s e t ( newX , newY , v e h i c l e ) ; i f ( move = = V e h i c l e .MOVE_LEGAL ) { mArea [ oldX ] [ oldY ] = n u l l ; } r e t u r n move ; } public V e h i c l e g e t ( i n t x , i n t y ) { r e t u r n mArea [ x ] [ y ] ; } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
26/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, GameArea.java 3/4 public i n t s e t ( i n t x , i n t y , V e h i c l e 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 = V e h i c l e .MOVE_OUT ; } r e t u r n move ; } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
27/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇríklad CarGame, GameArea.java 4/4 public void p r i n t ( ) { / / V y t i s k n i p o l e System . o u t . p r i n t ( " GameArea : \ n " ) ; f o r ( i n t i = mHeight − 1 ; i > = 0 ; i − −) { System . o u t . p r i n t ( " ∗ " ) ; f o r ( i n t j = 0 ; j < mWidth ; j + + ) { i f ( get ( i , j ) = = null ) { System . o u t . p r i n t ( " " ) ; } else { get ( i , j ) . p r i n t ( ) ; } } System . o u t . p r i n t ( " ∗ \ n " ) ; } } } c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
28/29
Úvod do programovacích jazyku˚ (Java), 7
Abstraktní tˇrídy Rozhraní (interface) Konstanty Pˇríklady
Abstraktní tˇrídy, pˇrí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 ) ; V e h i c l e vs [ ] = new V e h i c l e [NUMBER_OF_CARS ] ; / / v y t v o r dve auta a p o l o z j e do h r a c i h o p o l e vs [ 0 ] = new Car ( 4 , 4 , gameArea ) ; gameArea . s e t ( vs [ 0 ] . getX ( ) , vs [ 0 ] . getY ( ) , vs [ 0 ] ) ; ... vs [ 2 ] = new Truck ( 8 , 8 , gameArea ) ; gameArea . s e t ( vs [ 2 ] . getX ( ) , vs [ 2 ] . getY ( ) , vs [ 2 ] ) ; ... c
2006
Michal Krátký
Úvod do programovacích jazyku˚ (Java)
29/29