przegląd

Transkrypt

przegląd
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 1
Język obiektowy
James Gosling, Mike Sheridan, Patrick Naughton
Sun Microsystems
1995 (20 lat młodszy od C)
• C jest językiem proceduralnym
• Java jest językiem obiektowym
Języki obiektowe zawierają wszystko potrzebne do programowania proceduralnego, i jeszcze więcej.
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 2
Uruchomienie programu w Jawie
• Kompilacja
javac prog.java
powoduje wyprodukowanie kilku plików o rozszerzeniu
.class , m.in. Main.class
• wykonanie:
java Main
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 3
Czego brakuje strukturom w C
typedef struct {
int licz, mian;
void skracanie () {
int nwd = najw wsp dz(licz, mian);
licz = licz/nwd; mian = mian/nwd;
}
prywatne int najw wsp dz(int n, int k) {
while (n != k)
if (n < k) k -= n;
else n -= k;
return n;
}
} ulamek;
W C nie ma możliwości
• umieszczenia
wewnątrz struktury
funkcji obsługującej
pola tej struktury;
• ukrycia funkcji
pomocniczej
wewnątrz struktury,
żeby nie była
widoczna poza tą
strukturą.
ulamek u = {-2, 4};
u.skracanie();
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 4
Jak to samo osiąga się w Jawie
— patrz plik Ulamki1.java .
W Jawie:
• Strukturom odpowiadają klasy (np. klasa Ulamek). Klasa jest złożonym typem danych; może zawierać
– wartości („własności”) — jak w C (np. licz); oraz
– funkcje („metody ”) — w przeciwieństwie do C (np. skracanie).
• Klasa może mieć własności i metody do użytku wewnętrznego, niewidoczne dla programu — oznaczone private (np. najw wsp dz).
• Po zadeklarowaniu klasy class Nazwa klasy { . . . }
możemy w zwykły sposób deklarować zmienne:
Nazwa klasy
nazwa zmiennej ;
Działają zwykłe deklaracje z inicjalizacją:
Nazwa klasy
nazwa zmiennej
= konkretny obiekt ;
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 5
Jak to samo osiąga się w Jawie
— patrz plik Ulamki1.java .
W Jawie:
• Jedną (lub więcej) z metod klasy jest zwykle konstruktorem obiektów
tej klasy. Ma ona nazwę taką samą jak nazwa klasy i nie jest poprzedzona typem wynikowym (ani void-em) — jej typem wynikowym jest
definiowana klasa.
• Konstruktor służy do tworzenia i inicjalizowania obiektów klasy. Np.
Ulamek ul = new Ulamek(3, 4);
ul.licz ul.mian
Z ......
Ulamek : Z × Z →
........
......
Ulamek .............................
...
....
......
............ ...............
...
ul.skracanie
...
.
.
.
............ ............
❦......
✲
Z
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 6
Jak to samo osiąga się w Jawie
— patrz plik Ulamki1.java .
Co z klasy Ulamek widzi program
używający jej obiektów?
ul.licz ul.mian
Z ......
Ulamek : Z × Z →
........
.....
Ulamek .............................
.
..
.....
Z
✲
......
........... ................
..
ul.skracanie
...
.
.
.
.
............ ...........
❦......
• całkowity licz — licznik ułamka
• całkowity mian — mianownik ułamka
• konstruktor Ulamek (int ll, int mm) — tworzący ułamek z podanego licznika i mianownika
• metoda skracanie() — upraszczająca ułamek
Metoda najw wsp dz jest prywatna, więc niewidoczna z zewnątrz.
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 7
Jak to samo osiąga się w Jawie
Różnica między funkcjami w C i metodami w Javie
• Funkcja w C działa na wszystkie wartości tego samego typu.
• Metoda w Jawie należy do konkretnego obiektu; metoda innego
obiektu tej samej klasy może działać inaczej.
• Metoda jakiegoś obiektu może być wywołana bez argumentów; np.
ul.skracanie();
powoduje uproszczenie ulamka ul .
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 8
Ułamki, c.d.
Program na dodawanie ułamków: — patrz plik Ulamki2.java .
• Wyjście:
System.out.print( . . . );
Łączenie (konkatenacja) napisów: znak + .
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 9
Ułamki, c.d.
Program na dodawanie ułamków: — patrz plik Ulamki2.java .
• Wejście: Potrzebna jest biblioteka:
import java.util.Scanner;
Trzeba utworzyć obiekt klasy Scanner :
Scanner czytnik = new Scanner(System.in);
Przeczytanie jednego wiersza z klawiatury:
String napis = czytnik.nextLine();
• Czytanie liczby z napisu:
int liczba = Integer.parseInt(napis);
double liczba = Double.parseDouble(napis);
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 10
Bardziej skomplikowany program: lista płac
— patrz plik Lista plac.java .
• Komendy
if
for
while
do...while
switch
— jak w C
• Nowe typy:
– String — odpowiada char* z C
– Boolean — zawiera wartości logiczne true i false mogące występować w warunkach if-ów i while-ów
• Nowe typy: klasa ArrayList<. . . > — nieograniczona tablica z operacjami:
– size — liczba elementów listy
– get — wybieranie elementu o podanym indeksie
– add — dodawanie nowego elementu
– remove — usuwanie elementu o podanym indeksie
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 11
Bardziej skomplikowany program: lista płac
— patrz plik Lista plac.java .
• Stare typy w nowym opakowaniu:
– jest int (tylko typ) — ale też nowy Integer (klasa)
– jest double (tylko typ) — ale też nowy Double (klasa)
– jest char (tylko typ) — ale też nowy Character (klasa)
• Stare typy w nowym opakowaniu:
– deklaracja tablicy liczb całkowitych:
int[ ] tab; — na razie liczba jej elementów jest nieustalona;
– ustalenie długości zadeklarowanej tablicy:
tab = new int[15]; — ciągle jest wypełniona śmieciami;
– deklaracja tablicy z inicjalizacją:
int[ ] tab = { 1, 5, -3, 0};
– długość tablicy: tab.length
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 12
Jeszcze bardziej skomplikowany program: robale
— patrz plik Robale.java .
• Każdy owad jest obiektem klasy Robale.
• Poszczególne owady różnią się kolorem, prędkością biegania i trasą
biegania.
• Cała informacja dotycząca wyglądu i biegu poszczególnego owada zapisana jest wyłącznie w nim samym — tylko sam owad wie, jak powinien się wyświetlać i ruszać.
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 13
Jeszcze bardziej skomplikowany program: robale
— patrz plik Robale.java .
• Biblioteki do grafiki: javax.awt.* i javax.swing.* .
• Biblioteki do reagowania na „wydarzenia” (w tym programie tylko
na upływ czasu): javax.awt.event.* .
• W programie głównym (czyli w metodzie main klasy Main )
ustala się cechy okna i dodaje się do niego obrazek zdefiniowany w
innej klasie.
• Konstruktor klasy Obrazek tworzy robale; a następnie włącza stoper
i określa, co się ma zdarzyć po upłynięciu określonego czasu (potrzebne
do animacji) — ma się zmienić stan licznika czasu, owady mają się o
niej dowiedzieć, i obrazek ma zostać namalowany na nowo.
• Metoda paintComponent wywołuje metody poszczególnych owadów, służące do ich namalowania.
Wykład 13. Programowanie obiektowe z lotu ptaka, str. 14
Jeszcze bardziej skomplikowany program: robale
— patrz plik Robale.java .
Ruch pojedynczego i-tego owada:
r i (t) =
cos(2π(i + 1)t) , sin(2π(2i + 1)t)
więc w trakcie jednego przebiegu parametru t od 0 do 1, owad i-ty przebiega
• i + 1 razy od prawej ściany do lewej i z powrotem,
• 2i + 1 razy od górnej ściany do dolnej i z powrotem.
i i + 1 2i + 1
0
1
1
okrąg
.
.........
1
2
3
2
3
5
... ..... .....
...
... ....
..
.
..
.. ......
.
..
.
.. ................
...