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 ... ..... ..... ... ... .... .. . .. .. ...... . .. . .. ................ ...