E N D
1. Podstawowe aspekty programowania w Javie Michal Kuciapski
m.kuciapski@univ.gda.pl
2. Celem przedmiotu jest ukazanie podstawowych elementów skladni jezyka programowania Java wraz z wykazaniem praktycznego ich zastosowania w tworzeniu aplikacji konsolowych, na podstawie rozbudowanego przykladu przy wsparciu ze strony technik analizy i projektowania obiektowego.
3. Programowanie obiektowe
4. Programowanie obiektowe Koncepcja, korzysci i podstawowe pojecia
5. 5 z 137 Koncepcja programowania obiektowego Programowanie obiektowe zaklada tworzenie oprogramowania skladajacego sie ze spolecznosci obiektów, ulozonych w hierarchiczne struktury i potrafiacych komunikowac sie ze soba poprzez przesylanie wiadomosci, dla realizowania celów systemu.
Programowanie obiektowe czerpie swoja koncepcje z rzeczywistego swiata otaczajacego nas skladajacego sie z olbrzymiej ilosci obiektów, jak np.: ludzie, budynki i struktur, jak np. organizacje.
6. 6 z 137 Koncepcja programowania obiektowego
7. 7 z 137 Korzysci programowania obiektowego dlaczego?
8. 8 z 137 Podstawowe pojecia obiektowosci
9. 9 z 137 Podstawowe pojecia obiektowosci
10. 10 z 137 Paradygmat obiektowy Opanowywanie zlozonosci (dziedziny) problemu opiera sie na powszechnie stosowanych zasadach:
rozróznianie poszczególnych obiektów
tworzenie pojec - laczenie obiektów w klasy
znajdowanie zaleznosci miedzy pojeciami - klasami, wyprowadzanie nowych
okreslanie relacji miedzy obiektami
11. Programowanie obiektowe Klasy i obiekty
12. 12 z 137 Klasa definicja i koncepcja Klasa opis obiektu lub obiektów z jednolitym zbiorem atrybutów i uslug, zawierajacy opis tworzenia nowych obiektów w klasie.
Klasa = wspólne wlasnosci + wspólne zachowania
Klasy dla umozliwienia pisania programów tak, jak rozwazany problem sa zoorganizowane w struktury, co zapewnia: stabilnosc , przejrzystosc, zrozumialosc i wielokrotna wykorzystywalnosc kodu.
13. 13 z 137 Klasa przyklad struktury
14. 14 z 137 Definiowanie klasy wersja uproszczona class NazwaKlasy {
//pola
typ_zmiennej zmienna;
// konstruktor - metoda o tej samej nazwie co klasa wywolywana automatycznie
// przy tworzeniu obiektu danej klasy
NazwaKlasy (typ_argumentu nazwaAgrumentu){
tresc konstruktora
}
// metody
typ_zwracanej_wartosci nazwaMetody (typ_argumentu nazwaAgrumentu [,
]){
tresc metody
}
} //koniec definicji klasy
15. 15 z 137 Definiowanie klasy wersja kompletna [modyfikatory] class NazwaKlasy [extends NazwaNadklasy] [implements NazwyInterfejsów] {
//pola
[modyfikatory] typ_zmiennej zmienna;
// konstruktor - metoda o tej samej nazwie co klasa wywolywana automatycznie
// przy tworzeniu obiektu danej klasy
NazwaKlasy (typ_argumentu nazwaAgrumentu [,
]){
tresc konstruktora
}
// metody
[modyfikatory] typ_zwracanej_wartosci nazwaMetody (typ_argumentu nazwaAgrumentu [,
]){
tresc metody
}
} //koniec definicji klasy
16. 16 z 137 Definiowanie klasy modyfikatory
17. 17 z 137 Definiowanie klasy abstract i final
18. 18 z 137 Definiowanie klasy przyklady deklaracji Public:
public class Nauczyciel {definicja}
public class Nauczyciel extends Osoba {definicja}
Bez modyfikatora dostepu:
class Nauczyciel {definicja}
Abstract:
abstract class FiguraPlaska {definicja}
public abstract class Osoba {definicja}
Final:
public final class Math extends Object {definicja}
19. 19 z 137 Definiowanie klasy przyklady definicji
20. 20 z 137 Definiowanie klasy przyklady definicji
21. 21 z 137 Definiowanie klasy przyklady definicji public class Klient {
public static int wiek;
public static byte iloscLat = 26;
public static miesiaceZycia(byte lata) {
return lata * 12;
}
public static void main(String[] args) {
wiek = miesiaceZycia(iloscLat);
System.out.writeln(wiek);
}
}
22. 22 z 137 Klasy dziedziczenie - definicja i koncepcja Dziedziczenie - jest operacja polegajaca na utworzeniu nowej klasy na bazie klasy juz istniejacej. Nowa klasa nosi podklasy (ang. subclass), a klasa z której dziedziczy nazwe nadklasy (ang. superclass). Podklasa jest uszczególowieniem nadklasy.
Dziedziczenie polega na przejeciu pól i metod z jednej klasy (nadklasy) przez druga klase (podklase).
Zwiazek dziedziczenia mozna opisac slowem jest np. student jest osoba.
Stosowanie dziedziczenia pomaga w praktyce wykorzystywac zasade ponownego uzycia.
23. 23 z 137 Klasy dziedziczenie - zalozenia Dziedziczenie w jezyku Java:
Jest mozliwe wylacznie jednokrotne wylacznie jedna nadklasa;
Podczas dziedziczenia sa uwzglednione modyfikatory dostepu i wlasciwosci:
Niemozliwe jest dziedziczenie z klas o modyfikatorach: private, final
Pola i metody o modyfikatorze dostepu private nie sa dziedziczone;
Podczas dziedziczenia sa uwzglednione typy klas niemozliwe jest dziedziczenie z klas lokalnych czy wewnetrznych
24. 24 z 137 Klasy dziedziczenie - deklaracja [modyfikatory] class NazwaKlasy [extends NazwaNadklasy]
extends slowo kluczowe wskazujace, ze klasa dziedziczy pola i metody innej klasy
NazwaNadklasy nazwa klasy, z której klasa dziedziczy pola i metody
Przyklady:
public class Student extends Osoba
class Analiza extends Applet
25. 25 z 137 Klasy dziedziczenie - przyklady
26. 26 z 137 Klasy dziedziczenie - przyklady
27. 27 z 137 Klasy dziedziczenie - przyklady
28. 28 z 137 Typy klas
29. 29 z 137 Typy klas przyklady klasa wewnetrzna public class Test
{
private int m_nLiczba = 0;
private Licznik licznik;
public static void main(String args[])
{
Test test = new Test();
test.licznik = test.new Licznik();
test.licznik.dodaj();
System.out.println("Licznik = " + test.licznik.wez());
}
class Licznik
{
public int wez()
{
return m_nLiczba;
}
public void dodaj()
{
m_nLiczba++;
}
}// koniec definicji klasy wewnetrznej Licznik
}// koniec definicji klasy zewnetrznej Test
30. 30 z 137 Typy klas przyklady klasa lokalna public class Test
{
private int m_nLiczba = 0;
public static void main(String args[])
{
final Test test = new Test();
class Licznik
{
int wez()
{return test.m_nLiczba; }
void dodaj()
{test.m_nLiczba++; }
};
Licznik licznik = new Licznik();
licznik.dodaj();
System.out.println("Licznik = " + licznik.wez());
}
}
31. 31 z 137 Typy klas przyklady klasa anonimowa public class Test
{
private int m_nLiczba = 0;
private Licznik licznik;
public static void main(String args[])
{
Test test = new Test();
test.licznik.dodaj();
PrintWriter stdout = new PrintWriter(System.out, true);
stdout.println("Licznik = "+test.licznik.wez());
}
Test()
{
this.licznik = new Licznik()
{
public int wez()
{return m_nLiczba; }
public void dodaj()
{m_nLiczba++; }
};
}
}
32. 32 z 137 Klasy pakiety definicja i koncepcja Pakiety sa zbiorem klas wydzielonych ze wzgledu na wspólna tematyke i ulozonych hierarchicznie. Organizacja klas w ten sposób umozliwia lepsze ich zarzadzanie i jest odpowiednikiem bibliotek w jezykach proceduralnych.
Organizacja klas w pakiety ulatwia znaczaco ich wykorzystanie przy definiowaniu nowych.
Mozliwe jest tworzenie wlasnych pakietów jak i dodawanie definiowanych klas do juz istniejacych.
Umieszczenie klas w pakiecie jest analogiczne do umieszczenia klas w strukturze katalogów.
33. 33 z 137 Klasy pakiety przyklady
34. 34 z 137 Wykorzystanie poprzez wyrazenie:
import sciezka_do_pakietu(ów);
import java.io.*;
import java.util.*;
Definiowanie poprzez wyrazenie:
package sciezka_umieszczenia_pakietu;
package figury;
package figury.plaskie;
Instrukcje zwiazane z pakietami sa umieszczane na poczatku definicji klasy. Klasy pakiety wykorzystanie i definiowanie
35. 35 z 137 Klasy pola definicja i nazewnictwo Pola danych sa atrybutami klasy, pelniacymi role analogiczna do zmiennych lub stalych, z ta róznica, ze sa widoczne co najmniej w obrebie calej klasy.
Pola danych sa one deklarowane na tych samych zasadach, co zmienne lokalne, ale bezposrednio po deklaracji klasy.
Dla rozróznienia nazw pól od pozostalych zmiennych nalezy stosowac podczas deklaracji nazwy zgodnie z przyjeta konwencja. Najczesciej uzywa sie przedrosków, jak pol czy atr, np.: polImie, atrImie.
36. 36 z 137 Klasy pola - deklaracja [modyfikatoryPola] TypPola NazwaPola;
37. 37 z 137 Klasy pola - przyklady
38. 38 z 137 Klasy pola - modyfikatory dostepu
39. 39 z 137 Klasy - pola i metody modyfikatory dostepu
40. 40 z 137 Klasy pola - modyfikatory wlasciwosci
41. 41 z 137 Klasy pola - przyklady
42. 42 z 137 Klasy pola - przyklady class Pole
{
static int statyczne = 0;
}
public class Test
{
Pole pole1 = new Pole();
Pole pole2 = new Pole();
void testujPola() {
System.out.println("Wywolanie poprzez klase:" + Pole.statyczne);
System.out.println("Wywolanie poprzez obiekt:" + pole1.statyczne);
pole2.statyczne = 2;
System.out.println("Wywolanie poprzez obiekt:" + pole1.statyczne);
Pole.statyczne = 100;
System.out.println("Wywolanie poprzez obiekt:" + pole2.statyczne);
}
}
43. 43 z 137 Klasy metody definicja i nazewnictwo Metoda jest zbiorem instrukcji (blokiem kodu) przypisanych do jednej przestrzeni nazw majacej wlasciwosc wielokrotnego wykorzystania.
Celem metod jest umozliwienie wielokrotnego wywolania tego samego fragmentu kodu poprzez podanie jego nazwy.
Metody moga byc definiowane w dowolnym miejscu klasy.
Metody nie zwracajace wartosci nosza nazwe procedur, a metody zwracajace wartosci nosza nazwe funkcji.
44. 44 z 137 Klasy metoda - deklaracja [modyfikatory] TypZwracanejWartosci nazwaMetody([Parametry])
{
//tresc metody
}
45. 45 z 137 Klasy metody - modyfikatory dostepu
46. 46 z 137 Klasy - pola i metody modyfikatory dostepu
47. 47 z 137 Klasy pola - modyfikatory wlasciwosci
48. 48 z 137 Klasy metody - przyklady public Nauczyciel dodaj() throws IOException
{
PobieranieDanych tym = new PobieranieDanych();
tym.dodajNauczyciel();
if (tym.czyPracuje.equals(""))
return new Nauczyciel(tym.imie, tym.nazwisko,
tym.wiek);
else
return new Nauczyciel(tym.imie, tym.nazwisko,
tym.wiek, tym.pracuje, tym.pensja);
}
49. 49 z 137 Klasy metody - przyklady
50. 50 z 137 Klasy metody - przyklady public void usuwanieOsoby(ArrayList parOsoba, int parPozycjeWyszukane[]) throws IOException
{
PobieranieDanych tym = new PobieranieDanych();
if (tym.czyUsunac() == true)
{
for (int i = 0, wielkoscZmniejszenia = 0; i < this.iloscZnalezien; i++,
wielkoscZmniejszenia++)
{
parOsoba.remove(parPozycjeWyszukane[i] -
wielkoscZmniejszenia);
}
System.out.println("Pozycje skasowane");
}
}
51. 51 z 137 Klasy metody - przeciazenie Przeciazanie metod polega na definiowaniu metod o tych samych nazwach, rozróznianych na podstawie ilosci lub typów parametrów. Umozliwia to wywolanie odpowiedniej metody w zaleznosci od parametrów wywolania. Nie mozliwe jest rozróznianie metod na podstawie zwracanych przez nie typów wartosci.
Przeciazanie umozliwia posiadanie definicji szeregu metod wykonujacych rózne instrukcje, ale posiadajace ta sama nazwe. Znaczaco ulatwia to programowanie i poprawia przejrzystosc kodu.
52. 52 z 137 Klasy metody przeciazenie Przyklad
public Prostokat(double parBok1) {
atrNazwa = "Kwadrat";
atrBokLubPromien = parBok1;
}
public Prostokat(double parBok1, double parBok2) {
atrNazwa = "Prostokat";
atrBokLubPromien = parBok1;
atrBok2 = parBok2;
}
53. 53 z 137 Klasa konstruktor definicja
Konstruktor jest metoda wywolywana w trakcie tworzenia obiektu, sluzaca glównie inicjalizacji wartosci pól obiektu.
Konstruktor posiada identyczna nazwe z nazwa klasy i podobnie jak pozostale metody moze byc przeciazany.
54. 54 z 137 Klasa konstruktor definicja
Konstruktor jest metoda wywolywana w trakcie tworzenia obiektu, sluzaca glównie inicjalizacji wartosci pól obiektu.
Konstruktor posiada identyczna nazwe z nazwa klasy i podobnie jak pozostale metody moze byc przeciazany.
55. 55 z 137 Klasa konstruktor zalozenia
Gdy klasa nie posiada zdefiniowanego konstruktora wykonywany jest domyslny konstruktor nadklasy.
Za pomoca slowa kluczowego super mozliwe jest wywolanie konstruktora nadklasy.
Slowo kluczowe this oznacza odwolanie do aktualnego obiektu.
56. 56 z 137 Klasa konstruktor przyklad
public class Student extends Osoba
{
public Student (String parImie, String parNazwisko, int parWiek, int parNrIndeksu, double parSrednia)
{
super(parImie, parNazwisko, parWiek);
this.nrIndeksu = parNrIndeksu;
this.srednia = parSrednia;
}
}
57. 57 z 137 Klasa konstruktor przyklad public abstract class Osoba
{
protected String imie;
protected String nazwisko;
protected int wiek;
public Osoba ()
{
}
public Osoba (String parImie, String parNazwisko, int parWiek)
{
this.imie = parImie;
this.nazwisko = parNazwisko;
this.wiek = parWiek;
}
58. 58 z 137 Obiekt definicja i koncepcja Obiekt jest abstrakcja czegos w dziedzinie problemu, odzwierciedlajaca zdolnosci systemu do przechowywania informacji o tym, interakcji z tym czyms, lub obie te rzeczy.
Obiekt programistyczny jest modelem rzeczywistego obiektu, np.: student czy nauczyciel. Jest swego rodzaju nowym typem danych.
Obiekt jest generowany na podstawie wzorca klasy, bedacej abstrakcja grupy obiektów o podobnej charakterystyce.
Obiekt =
(identyfikakacja) - nazwa
+ stan (pola)
+ zachowanie (metody)
59. 59 z 137 Obiekt - klasyfikacja Obiekty interfejsu uzytkownika
Uzytkownik programu kontaktuje sie bezposrednio z nimi
Nazywane sa czasami widgets (window gadgets)
Przyklady: przyciski, listy wyboru, listy przewijane
Obiekty srodowiska operacyjnego
Sa kontrolowane przez system operacyjny
Udostepniaja uslugi innym obiektom
Obiekty zadaniowe
Dokumenty
Multimedia
Obiekty dziedziny przedmiotowej np.: faktura, konto, pracownik
60. 60 z 137 Obiekt deklaracja, inicjalizacja, definicja Deklaracja
TypObiektu NazwaObiektu;
Przyklad: Nauczyciel nauczyciel1;
Inicjalizacja
NazwaObiektu = new NazwaObiektu(ParametryKonstruktora);
Przyklad: nauczyciel1 = new Nauczyciel( Jan, Adamski, 29);
Definicja
TypObiektu NazwaObiektu = new NazwaObiektu(ParametryKonstruktora);
Przyklad
Student student1 = new Student(tym.imie, tym.nazwisko, tym.wiek, tym.nrIndeksu, tym.srednia);
61. 61 z 137 Obiekt odwolanie do pól i metod Odwolywanie do pól i metod obiekty nastepuje za pomoca operatora .
Przyklady:
imie = parImie;
this.imie = noweDane.imie;
tym.czyPracuje.equals("");
UzupelnijAtrybuty();
System.out.println(wyswietlanyTekst);
tym.wiek = Integer.parseInt(dane);
OperacjePlikowe.wczytajDaneNauczycieli(nauczyciele);
nauczyciele.add(dodawany.dodaj());
daneNauczycieli.add(new Nauczyciel(tym.imie, tym.nazwisko, tym.wiek, tym.pracuje, tym.pensja));
62. 62 z 137 Zwiazki pomiedzy obiektami i klasami Bardzo rzadkie sa przypadki, aby obiekty funkcjonowaly zupelnie niezaleznie od siebie Mozna wyróznic 2 rodzaje zwiazków pomiedzy nimi.
Asocjacja
Zwiazek o charakterze strukturalnym
Wskazuje, które obiekty wzajemnie sie znaja
63. 63 z 137 Zwiazki pomiedzy obiektami i klasami Kompozycja
Zwiazek o charakterze calosc-czesc
Ma mocniejszy charakter jeden z obiektów nie moze istniec bez drugiego
Obiekty wzajemnie wiedza o swoim istnieniu
Mozna opisac ten zwiazek slowem ma
64. 64 z 137 Obiekty i klasy - polimorfizm Polimorfizm to mozliwosc nadawania tej samej nazwy róznym atrybutom i operacjom oraz wykonywania róznych procedur i akcji przez operacje o tych samych nazwach; pozwala na redukcje liczby nazw atrybutów i operacji.
Polimorfizm umozliwia rozróznianie operacji dla poszczególnych obiektów klas bedacych specyfikacjami nadklasy, gdy sa wykonywane jako obiekt nadklasy.
Polimorfizm umozliwia podstawianie pod obiekt nadklasy obiektów podklas.
65. 65 z 137 Obiekty i klasy polimorfizm - przyklad public abstract class FiguraPlaska
{
protected String atrNazwa;
FiguraPlaska()
{
this.atrNazwa = "Nieznana";
}
public double obwód()
{
return 0.0;
}
}
66. 66 z 137 Obiekty i klasy polimorfizm przyklad c.d public class Wyswietl
{
public static void wyswietlInf(FiguraPlaska parFigura)
{
System.out.println(parFigura.atrNazwa);
System.out.println(parFigura.obwód());
}
}
67. 67 z 137 Obiekt - usuwanie Java nie wymaga definiowania destruktorów. Jest tak dlatego, ze istnieje mechanizm automatycznego zarzadzania pamiecia (ang. garbage collection). Obiekt istnieje w pamieci tak dlugo, jak dlugo istnieje do niego jakakolwiek referencja w programie, w tym sensie, ze gdy referencja do obiektu nie jest juz przechowywana przez zadna zmienna obiekt jest automatycznie usuwany a zajmowana przez niego pamiec zwalniana.
W Javie zautomatyzowane istnieje mozliwosc deklaracji specjalnej metody finalize, która bedzie wykonywana przed usunieciem obiektu z pamieci. Deklaracja takiej metody ma zastosowanie, gdy nasz obiekt np.: ma referencje do urzadzen wejscia-wyjscia.
68. 68 z 137 Obiekt usuwanie - przyklad
protected void finalize () throws Throwable
{
if (m_plik != null)
{
m_plik.close();
m_plik = null;
}
}
69. 69 z 137 Obiekty rzutowanie definicja i skladnia
Rzutowanie (ang. casting) polega na skonwertowaniu zmiennej do pozadanego typu. Mozliwe jest jedynie rzutowanie okreslonych typów na inne np.: double na int i odwrotnie.
W przypadku tworzonych obiektów mozliwe jest jedynie rzutowanie nadklasy na podklase (najczestszy przypadek) i na odwrót. W drugim przypadku nastepuje utrata pól i metod niezdefiniowanych w nadklasie.
70. 70 z 137 Obiekty rzutowanie przyklad public class Kolo extends FiguraPlaska
{
// wczesniejsze instrukcje
double pole()
{
return 34.1;
}
}
public class Wyswietl
{
public static void wyswietlInf(FiguraPlaska parFigura)
{
Kolo kolo = new Kolo();
//wczesniejsze instrukcje
kolo = (Kolo)parFigura;
System.out.println(kolo.pole());
}
}
71. 71 z 137 Obiekty podstawowe typy
72. 72 z 137 Obiekty podstawowe typy String - metody
73. 73 z 137 Obiekty podstawowe typy String - przyklad public class StringTest
{
public static void main(String[] args){
String dane = " Arkadiusz Radomski ";
System.out.println("Dane: " + dane);
System.out.println("Dane z malej litery: " + dane.toLowerCase());
System.out.println("Nazwisko na pozycji:" + dane.indexOf("Radomski"));
System.out.println("Znaki od 5 do 12:" + dane.substring(5,12));
System.out.println("Dlugosc napisu" + dane.length());
System.out.println("Napis bez poczatkowych i koncowych spacji: " +
dane.trim() + "****");
}
}
74. 74 z 137 Obiekty podstawowe typy Date - metody
75. 75 z 137 Obiekty podstawowe typy Date - format Za format daty jest odpowiedzialna klasa DateFormat.
Podstawowe style w zaleznosci od dlugosci prezentacji daty:
SHORT - np. 12.13.52 or 3:30pm
MEDIUM - np. Jan 12, 1952
LONG np. January 12, 1952 or 3:30:32pm
FULL np. Tuesday, April 12, 1952 AD or 3:30:42pm PST.
Metoda getInstance() umozliwia pobranie lokalnego profilu wyswietlania daty. Metoda format(Date date) umozliwia przeformatowanie daty zgodnie z przyjetym profilem.
76. 76 z 137 Obiekty podstawowe typy Date - przyklad import java.util.*; import java.text.DateFormat;
public class TestData
{
static Date data = new Date(1997,12,05,14,45,32);
public static void main(String args[])
{
System.out.println("Wprowadzona data: " + data.toString());
System.out.println("Rok: " + data.getYear());
System.out.println("Czas: " + data.getTime());
data.setYear(27);
System.out.println("Nowa data: " + data.toString() );
DateFormat formatDaty = DateFormat.getInstance();
System.out.println("Data pokazana zgodnie z profilem lokalnym:\n"
+ formatDaty.format(data)) ;
formatDaty = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
System.out.println("Data pokazana zgodnie z profilem \"najdluzszym\":\n"
+ formatDaty.format(data));
}
}
77. 77 z 137 Pakiet java.util zawiera dwie klasy zwiazane z data i czasem systemowym:
Calendar
GregorianCalendar
Obiekt reprezentujacy kalendarz z aktualna data i czasem mozna wiec utworzyc na dwa sposoby:
Calendar calendar = Calendar.getInstance();
GregorianCalendar calendar = new GregorianCalendar ();
Pobranie daty i czasu umozliwia metoda get(): int dzien = calendar.get(Calendar.DAY_OF_MONTH); int miesiac = calendar.get(Calendar.MONTH)+1; int rok = calendar.get(Calendar.YEAR); int godz = calendar.get(Calendar.HOUR_OF_DAY); int min = calendar.get(Calendar.MINUTE); int sek = calendar.get(Calendar.SECOND); Obiekty podstawowe typy Date - pozostale klasy
78. 78 z 137 Interfejsy - definicja
Interfejsy sa szablonami klas wyrazajacymi jedynie, ze klasa która je implementuje musi zaimplementowac wszystkie metody wyrazone w interfejsie. Dzieki temu wymuszaja ich okreslona skladnie - zawieranie okreslonych procedur i funkcji przez klase.
Kazdy interfejs i klasa moze implementowac dowolna ilosc interfejsów.
Interfejsy definiuje sie podobnie do klas.
79. 79 z 137 Interfejsy definiowanie i wykorzystanie Deklaracja: [modyfikatory] interface NazwaInterfejsu
{
//deklaracje metod
}
Przyklad: public interface Uruchamianie
{
int przykladowaMetoda(int y);
}
Wykorzystanie: Deklaracja_klasy implements nazwa interfejsu
Przyklad:
class Animacja extends Applet implements Uruchamianie
{
}
80. Programowanie obiektowe Kolekcje
81. 81 z 137 Kolekcje - definicja Kolekcje umozliwiaja przechowywanie i zarzadzanie w pamieci obiektami dowolnego typu. Sa one kontenerami elementami umozliwiajacymi przechowywanie wielu obiektów.
Kolekcje sa elementem zblizonym funkcjonalnie do tablic z dwoma zasadniczymi róznicami:
Moga przechowywac obiekty róznego typu
Automatycznie zarzadzaja wielkoscia kolekcji
Celem kolekcji jest umozliwienie dynamicznego dodawania i usuwania obiektów bez koniecznosci zarzadzania pamiecia im przydzielana sa automatycznie dopasowujaca sie do zawartosci tablica.
82. 82 z 137 Kolekcje struktura - interfejsy
83. 83 z 137 Kolekcje przykladowe implementacje
84. 84 z 137 Kolekcje przykladowe implementacje c.d
85. 85 z 137 Kolekcje zdefiniowanie Aby móc zdefiniowac zmienna typu kolekcji nalezy najpierw zaimportowac odpowiednie klasy:
wszystkie - import java.util.*;
konkretna - import java.util.Vector;
Deklaracja:
TypKolekcji [<TypWartosci>] NazwaKolekcji = new TypKolekcji [<TypWartosci>]();
Przyklady:
ArrayList nauczyciele = new ArrayList();
Vector<String>names = new Vector<String>();
Map<String, Integer> m = new HashMap<String, Integer>();
86. 86 z 137 Kolekcje podstawowe metody
87. 87 z 137 Kolekcje podstawowe metody c. d.
88. 88 z 137 Kolekcje przyklady wykorzystania metod s1.containsAll(s2) ;
names.add(firstname);
nauczyciele.add(dodawany.dodaj());
nauczyciele.clear();
studenci.next();
parOsoba.remove(parPozycjeWyszukane[i] - wielkoscZmniejszenia);
Object listaStudentow[] = parStudenci.toArray();
parOsoba.get(parPozycjeWyszukane[numerOsoby - 1]);
a.set(i, a.get(j));
89. 89 z 137 Kolekcje - przechodzenie Przy wykorzystaniu petli for-each mozliwe jest przejscie przez wszystkie elementy kolekcji oraz tablicy.
Skladnia: for (TypWartosci zmienna : nazwaKolekcji)
{
//instrukcje
}
Przyklad:
for (Object o : collection)
System.out.println(o);
90. 90 z 137 Kolekcje przyklady - Vector import java.util.Vector;
public class PrzykladVector{
public static void main(String[]args){
Vector<String> imiona = new Vector<String>();
String[] imionaL = {Adam", Jan", Gosia", Patryk" };
for(String imie : imionaL){
imiona.add(imie);
}
for(String imie : imiona){
System.out.println(imie);
}
}
}
91. 91 z 137 Kolekcje przyklady - ArrayList public void wyswietlListaNauczycieli(ArrayList parNauczyciele)
{
Object listaNauczycieli[] = parNauczyciele.toArray();
int licznikNauczyciele;
System.out.println("\nL i s t a n a u c z y c i e l i :\n");
for (licznikNauczyciele = 0; licznikNauczyciele < listaNauczycieli.length; licznikNauczyciele++)
{
String wyswietlanyTekst, parPracuje;
Nauczyciel nauczyciel = (Nauczyciel) listaNauczycieli[licznikNauczyciele];
wyswietlanyTekst = licznikNauczyciele + 1 + ".";
System.out.println(wyswietlanyTekst);
nauczyciel.wyswietlInformacje();
}
}
92. 92 z 137 Kolekcje przyklady - Map import java.util.*;
public class Freq {
public static void main(String args[]) {
Map<String, Integer> m =
new HashMap<String, Integer>();
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null ? 1 : freq + 1));
}
System.out.println(m.size() + " róznych slów:");
System.out.println(m);
}
}
93. Programowanie obiektowe Wyjatki
94. 94 z 137 Definicja i koncepcja Wyjatki (ang. exceptions) sa sytuacja niestandardowa (specjalna) zwiazana z dzialaniem programu, powodujaca zawieszenie sie lub niepoprawne wykonanie programu.
Java posiada mechanizm obslugi wyjatków umozliwiajacy odpowiednie zareagowanie w takiej sytuacji i unikniecie zawieszenia lub niepoprawnego wykonania programu.
Przechwycenie wyjatku umozliwia przerwanie normalnego wykonywania programu i wykonanie instrukcji zwiazanych z jego obsluga.
95. 95 z 137 Przyklady sytuacji krytycznych
Istnieje szereg sytuacji krytycznych glównie zwiazanych z:
Operacjami na plikach:
Próba otwarcia pliku który nie istnieje,
Próba zapisania danych do pliku, do którego nie mamy uprawnien.
Niekompatybilne konwersje typów (np. ClassCastException, NumberFormatException )
Próba dostepu do elementu tablicy dalszym niz ostatni indeks (ArrayOutOfBoundsException)
Brak obiektu odwolania (NullPointerException)
96. 96 z 137 Struktura klas
97. 97 z 137 Generowanie sytuacji wyjatkowych
Generowanie (zgloszenie) wyjatku dokonujemy poprzez throw new Exception("..."), jako utworzenie obiektu typu Exception i przerywanie wykonania biezacej metody.
Aby wskazac i poinformowac JVM, ze metoda moze generowac wyjatek typu Exception nalezy na jej koncu dodac slowa kluczowe throws Exception. Uzycie tej frazy jest obowiazkowe, jesli nasza metoda moze generowac wyjatek, np. dla metod posiadajacych instrukcje zwiazane z I/O.
98. 98 z 137 Generowanie sytuacji wyjatkowych - przyklad
99. 99 z 137 Obsluga wyjatków - skladnia try
{
//blok instrukcji gdzie moze wystapic wyjatek
}
catch (ObiektImplementujacyInterfejsThrowable nazwaZmiennej)
{
//blok instrukcji obslugujacych wystapienia sytuacji wyjatkowej jest wykonywany tylko, gdy wystapi wyjatek typu takiego jak typ zmiennej bedacej parametrem bloku catch
}
finally //opcjonalnie
{
// ten blok instrukcji jest wykonywany przed opuszczeniem sterowania, //nawet jesli blok try zawiera instrukcje return lub spowodowal //wystapienie wyjatku
}
100. 100 z 137 Obsluga wyjatków - przyklad public class WywolajWyjatek
{
static public void main(String args[]) throws Exception
{
Liczba liczba = new Liczba();
try
{ liczba.dziel(1); }
catch (Exception e)
{ e.printStackTrace(); }
System.out.println("obsluga wyjatków dziala");
}
}
101. 101 z 137 Obsluga wyjatków - przyklad public static void zapiszDaneNauczycieli(ArrayList daneNauczycieli) throws IOException
{
FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt");
Object zapiszDane[] = daneNauczycieli.toArray();
String dane;
for (int i = 0; i < zapiszDane.length; i++)
{
Nauczyciel nauczyciel = (Nauczyciel) zapiszDane[i];
dane = nauczyciel.przygotujInformacje();
plikNauczyciele.write(dane);
}
plikNauczyciele.close();
}
102. 102 z 137 Obsluga wyjatków - przyklad
import java.io.*;
class WyjatekZapisz
{
public static void zapisz(String sciezka) throws IOException
{
FileWriter plik = new FileWriter(sciezka);
String dane = "Przykladowe Dane";
plik.write(dane);
plik.close();
}
}
103. 103 z 137 Obsluga wyjatków przyklad c. d. public class Test
{
public static void main(String args[]) throws IOException
{
try{
WyjatekZapisz wyjatek = new WyjatekZapisz();
wyjatek.zapisz("c:\\aaa1\\dane.txt");}
catch (IOException ioe){
System.out.println(ioe.toString());
}
System.out.println("Program jest wykonywany dalej");
}
}
104. 104 z 137 Obsluga wyjatków - przyklad import java.io.*;
public class WyjatekWczytaj
{
static File plik = new File("nieistniejacy.txt");
public static void main(String args[]) throws IOException
{
try {
FileInputStream wczytanie = new FileInputStream(plik);
int dane;
dane = wczytanie.read();
wczytanie.close();
}
catch (IOException ioe){
ioe.printStackTrace();
System.out.println("Blad przy otwarciu pliku " + plik.getName());}
}
}
105. 105 z 137 Obsluga wyjatków wazne metody
106. 106 z 137 Definiowanie wlasnych klas wyjatków - koncepcja W Javie mozliwe jest definiowanie wlasnych klas wyjatków dla obslugi sytuacji, uznawanych przez programiste za wyjatkowe.
Klasa, która ma byc odpowiedzialna za obsluge wyjatków w swojej definicji musi byc podklasa (dziedziczyc) z klasy Exception.
Aby wyjatki dla danej metody byly obslugiwane przez nasza klase wyjatków nalezy na koncu jej deklaracji dodac slowo kluczow throws oraz nazwe klasy obslugujacej wyjatki throws NazwaKlasyWyjatku.
107. 107 z 137 Definiowanie wlasnych klas wyjatków - skladnia class NazwaKlasyWyjatku extends Exception
{
NazwaKlasyWyjatku()
{
}
NazwaKlasyWyjatku(String s)
{
super("\Tekst wyswietlany przez wyjatek: " + s);
}
}
108. 108 z 137 Definiowanie wlasnych klas wyjatków - przyklad class WyjatekSrednia extends Exception
{
WyjatekSrednia()
{
}
WyjatekSrednia(String s)
{
super(s);
}
}
109. 109 z 137 Definiowanie wlasnych klas wyjatków przyklad c. d. class Student{
double sumaOcen = 0; int iloscOcen = 0; double srednia = 0;
void operacjeSrednia() throws WyjatekSrednia {
try {
srednia = sumaOcen / iloscOcen;
if (srednia < 2)
throw new WyjatekSrednia("Srednia nie moze byc nizsza niz 2");
if (srednia > 5)
throw new WyjatekSrednia("Srednia nie moze byc wyzsza niz 5");
System.out.println("Srednia ocen wynosi:" + this.srednia);}
catch(Exception e) {
System.out.println("Wyjatek: " + e.getClass() + " z nastepujacym komentarzem - " + e.getMessage());}
}
}
110. 110 z 137 Definiowanie wlasnych klas wyjatków przyklad c. d. public class TestWyjatki
{
public static void main(String[] args) throws Exception
{
Student student = new Student();
student.sumaOcen = Double.parseDouble(args[0]);
student.iloscOcen = Integer.parseInt(args[1]);
student.operacjeSrednia();
}
}
111. 111 z 137 Obsluga wielu wyjatków - koncepcja Istnieje mozliwosc obslugi wielu wyjatków odnosnie jednego fragmentu kodu try w podzieleniu na konkretne ich typy np. zarówno bledu braku pliku (obiekt typu IOException) do otwarcia oraz jego konca podczas wczytywania (obiekt typu EOFException).
W celu obslugi wielu wyjatków nalezy dla bloku try zdefiniowac odpowiednie bloki catch z paramerami jako obiekty odpowiadajace klasom wyjatków.
112. 112 z 137 Obsluga wielu wyjatków - skladnia try
{
//blok instrukcji gdzie moze wystapic wyjatek
}
catch (ObiektImplementujacyInterfejsThrowable nazwaZmiennej)
{
//blok instrukcji obslugujacych wystapienia sytuacji wyjatkowej
}
catch (ObiektImplementujacyInterfejsThrowable nazwaZmiennej)
{
//blok instrukcji obslugujacych wystapienia sytuacji wyjatkowej
}
113. 113 z 137 Obsluga wielu wyjatków - przyklad class NieprawidlowosciSrednia extends WyjatekSrednia
{
NieprawidlowosciSrednia()
{
}
NieprawidlowosciSrednia(int iloscOcen, double srednia)
{
super(\nNieprawidlowosci sredniej\n" + "Srednia wynosi zaledwie:" + srednia + "\n przy ilosci zaliczonych przedmiotów ponizej minimum równemu:" + iloscOcen);
}
}
114. 114 z 137 Obsluga wielu wyjatków przyklad c. d. class Student{
void operacjeSrednia() throws Exception
{
try
{
if ((iloscOcen < 8) && (srednia < 3.5))
throw new NieprawidlowosciSrednia(iloscOcen, srednia);
System.out.println("Srednia ocen wynosi:" + this.srednia);
115. 115 z 137 Obsluga wielu wyjatków inna wersja public class TestWyjatki
{
public static void main(String[] args) throws Exception {
Student student = new Student();
student.sumaOcen = Double.parseDouble(args[0]);
student.iloscOcen = Integer.parseInt(args[1]);
try{ student.operacjeSrednia(); }
catch(NieprawidlowosciSrednia ns)
{ ns.printStackTrace(); }
catch(WyjatekSrednia ws)
{ ws.printStackTrace(); }
}
}
116. Programowanie obiektowe Operacje wejscia - wyjscia
117. 117 z 137 Koncepcja Operacje wejscia wyjscia (ang. Input / Output, I/O) w Javie zrealizowane sa za pomoca klas zawartych w pakiecie java.io.
Programy Javy uzywaja strumieni (ang. streams) do wykonywania operacji wejscia /wyjscia, z tym, ze zarówno zródlem wejsciowym (ang. input source) jak i zródlem wyjsciowym (ang. output source) moze byc wszystko, co zawiera dane:
pliki,
lancuchy znakowe równiez pobierane z klawiatury,
pamiec.
118. 118 z 137 Koncepcja
Poczawszy od wersji Javy 1.1 zdefiniowano nowe, przeznaczone do poprawnego czytania strumienie znaków w standardzie Unicode.
Klasy obslugujace operacje I/O w Javie maja model warstwowy, co oznacza, ze poszczególne klasy posiadaja stosunkowo ograniczone mozliwosci, ale mozliwe jest uzyskanie ich odpowiednich wlasciwosci poprzez dodanie wyspecjalizowanych klas. Przykladowo, klasa wejsciowa InputStream nie jest buforowana (co oznacza, ze jednoczesnie moze byc pobierany wylacznie jeden znak), ale dzieki klasie BufferedInputStream mozliwe jest dodanie buforowania do klasy InputStream.
119. 119 z 137 Przeglad klas strumieni - InputStream
Jest abstrakcyjna nadklasa dla szeregu klas (np.: FileInputStream, SequenceInputStream) dostarczajaca podstawowy interfejs programistyczny wraz z czesciowa implementacja strumieni wejsciowych. Klasa InputStream definiuje metody przeznaczone do:
czytania bajtów lub tablic bajtów
zaznaczenia pozycji w strumieniu
opuszczenia czesci bajtów z wejscia
znajdowania liczby dostepnych bajtów do czytania i resetowania biezacej pozycji w strumieniu
120. 120 z 137 Przeglad klas strumieni - InputStream c.d.
Podczas tworzenia nowego strumienia wejsciowego, nastepuje jego automatyczne otworzenie.
Strumien wejsciowy zostaje zamkniety:
poprzez uzycie metody close
gdy do obiektu InputSteam nie ma juz zadnych referencji i jest usuwany z pamieci
121. 121 z 137 Przeglad klas strumieni - OutputStream Klasa OutputStream podobnie jak klasa InputStream jest abstrakcyjna nadklasa dla wielu klas (np.: FileOutputStream, PrintStream). Dostarcza ona minimalny interfejs programistyczny wraz z czesciowa implementacja strumieni wyjsciowych.
Klasa ta definiuje metody zapisywania bajtów lub tablic bajtów.
Strumien wyjsciowy jest automatycznie otwierany, gdy jest tworzony. Jego zamkniecie nastepuje:
poprzez uzycie metody close,
gdy do obiektu OutputStream nie ma juz zadnych referencji i jest usuwany z pamieci (ang. garbage collected).
122. 122 z 137 Przeglad klas strumieni strumienie znakowe W wersji Java 1.1 do pakietu java.io dodano nowe klasy do czytania strumieni zawierajacych znaki (ang. character streams). Klasy te dzialaja podobnie, jednak zamiast czytac i zapisywac bajty czytaja i zapisuja 2-bajtowe znaki Unicode. Ulatwia to pisanie programów niezaleznych od standardu kodowania znaków.
Strumienie znakowe nie sa uzyteczne tam gdzie dane sa zapisywane binarnie, np.: odczytywanie plików dzwiekowych czy implementacja protokolów sieciowych.
123. 123 z 137 Przeglad klas strumieni strumienie znakowe Klasy:
Do odczytu Reader, np.:
BufferedReader
FileReader
Do zapisu Writer, np.:
BufferedWritter
FileWritter
124. 124 z 137 Strumienie wejsciowe klawiatura InputStreamReader umozliwia odczytanie pojedynczych znaków.
Deklaracja:
InputStreamReader nazwaStrumienia = new InputStreamReader(InputStream in);
Przyklad:
InputStreamReader is = InputStreamReader(System.in);
Metody:
close() zamyka strumien
getEncoding() zwraca nazwe systemu kodowania
read() umozliwia wczytanie pojedynczego znaku
125. 125 z 137 Strumienie wejsciowe klawiatura BufferedReader umozliwia odczytanie znaków, które sa buforowane co daje mozliwosc odczytywania równiez tablic i calych linii.
Deklaracja:
BufferedReader nazwaStrumienia = new BufferedReader(Reader in);
Przyklad:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Metody:
close() zamyka strumien
getEncoding() zwraca nazwe systemu kodowania
read() / readLine() umozliwia wczytanie pojedynczego znaku / calej
linii
126. 126 z 137 Strumienie wejsciowe klawiatura - przyklad BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public void dodajOsoba () throws IOException
{
System.out.println("");
System.out.print("Podaj imie ");
imie = br.readLine();
System.out.print("Podaj nazwisko ");
nazwisko = br.readLine();
System.out.print("Podaj wiek ");
wiek = Integer.parseInt(br.readLine());
}
127. 127 z 137 Strumienie wyjsciowe ekran
System.out.print() / System.out.println() / umozliwiaja wypisanie na ekranie znaków. Ponadto instrukcja println powoduje przejscie do nowego wiersza.
Przyklad:
System.out.println("Jaka operacje chcesz wykonac (wpisz numer):");
128. 128 z 137 Strumienie wyjsciowe ekran PrintWriter klasa umozliwiajaca wypisanie na ekranie znaków. Zastepuje metody klasy System.out.
Deklaracja:
PrintWriter nazwaStrumienia = new PrintWriter(OutputStream out, boolean autoFlush) ;
Przyklad:
PrintWriter pw = PrintWriter(System.out, true) ;
Metody:
close()
getEncoding()
print() / println()
129. 129 z 137 Strumienie wyjsciowe ekran - przyklad import java.io.*;
public class WypisanieDanych
{
public static void main(String args[])
{
char[] wybór = {'1','2','3','4'};
PrintWriter pw = new PrintWriter(System.out, true);
pw.print("Jaka operacje chcesz wykonac (wpisz numer):");
pw.println(wybór);
}
}
130. 130 z 137 Strumienie wejsciowe plik FileReader umozliwia odczytanie pojedynczych znaków z pliku.
Deklaracja:
FileReader nazwaStrumienia = new FileReader(String fileName);
Przyklad:
FileReader fr = new FileReader(c:\studenci.txt);
Metody:
close() zamyka plik
getEncoding() zwraca nazwe systemu kodowania pliku
read() umozliwia wczytanie pojedynczego znaku
131. 131 z 137 Strumienie wejsciowe plik - przyklad public static void wczytajDaneStudentow(ArrayList daneStudentow) throws IOException
{
Object zapiszDane[] = daneStudentow.toArray();
BufferedReader wczytanie = new BufferedReader(new
FileReader("studenci.txt"));
PobieranieDanych tym = new PobieranieDanych();
String dane = new String();
try
{
while (true) {
dane = wczytanie.readLine();
if (dane == null)
break;
tym.imie = dane;
132. 132 z 137 Strumienie wejsciowe plik przyklad c. d. dane = wczytanie.readLine();
tym.nazwisko = dane;
dane = wczytanie.readLine();
tym.wiek = Integer.parseInt(dane);
dane = wczytanie.readLine();
tym.nrIndeksu = Integer.parseInt(dane);
dane = wczytanie.readLine();
tym.srednia = Double.parseDouble(dane);
daneStudentow.add(new Student(tym.imie, tym.nazwisko,
tym.wiek, tym.nrIndeksu, tym.srednia));
}
wczytanie.close();
} catch(EOFException e) {
wczytanie.close();
}
}
133. 133 z 137 Strumienie wyjsciowe plik FileWriter umozliwia zapisywanie danych do pliku.
Deklaracja:
FileWriter nazwaStrumienia = new FileWriter(String fileName, boolean append);
Przyklad:
FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt");
Metody:
close() zamyka plik
getEncoding() zwraca nazwe systemu kodowania pliku
write() zapisuje dane do pliku
134. 134 z 137 Strumienie wyjsciowe plik przyklad public static void zapiszDaneNauczycieli(ArrayList daneNauczycieli) throws IOException
{
FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt");
Object zapiszDane[] = daneNauczycieli.toArray();
String dane;
for (int i = 0; i < zapiszDane.length; i++)
{
Nauczyciel nauczyciel = (Nauczyciel) zapiszDane[i];
dane = nauczyciel.przygotujInformacje();
plikNauczyciele.write(dane);
}
plikNauczyciele.close();
}
135. 135 z 137 Strumienie wejsciowe/wyjsciowe plik RandomAccessFile jest klasa umozliwiajaca odczyt/zapis danych do pliku, poczawszy od dowolnego miejsca.
Miejsce dostepu okresla kursor o nazwie file pointer, od którego mozliwy jest odczyt/zapis danych. Sluza do tego dwie metody:
getFilePointer zwraca aktualna pozycje kursora
seek(long pos) umozliwia ustawienie pozycji kursora
Tryby dostepu:
r dostep w trybie odczytu
rw dostep w trybie zapisu
rws dostep w trybie zapisu i odczytu z wymaganiem synchronicznego zapisu danych i metadanych pliku
rwd - dostep w trybie zapisu i odczytu z wymaganiem synchronicznego zapisu danych
136. 136 z 137 Strumienie wejsciowe/wyjsciowe plik c. d. Deklaracja:
RandomAccessFile nazwaStrumienia = new RandomAccessFile(String name, String mode);
Przyklad:
RandomAccessFile raf = new RandomAccessFile ("nauczyciele.txt,rw);
Metody:
close() zamyka plik
read() / readLine() wczytuja dane z pliku
write(typ) / writeChars(String s) zapisuja dane do pliku