Historia i podstawowe
koncepcje
Język C
W latach 1960-70 trwają intensywne prace nad pierwszymi językami programowania zapewniającymi:
Łatwość użycia Efektywność kodu Łatwość rozszerzania Pierwszymi językami były: BASIC, COBOL i FORTRAN. Jednak ich konstrukcje przewidziane w ww. językach nie sprzyjały pisaniu
programów efektywnych i łatwych w rozumieniu.
Lata 1960
. Martin Richards stworzył język BCPL; podstawy programowania strukturalnegoKoniec 1960
. Ken Thompson opierając się na BCPL zdefiniował język B1969
. Dennis Ritchie opierając się na języku B zdefiniował język C zaimplementowany przez Dennisa Ritchie na komputerze DEC PDP-11 działającym pod systemem UNIXJęzyk C
Przez lata standard języka C był wyznaczany przez implementacje systemu UNIX - opisany przez B. Kernighana i D. Ritchie The C
Programming Language.
cd
W 1989 ANSI (American National Standards Institute) opracował standard języka C.
Język C swą popularność zawdzięcza temu, że został zaprojektowany, zaimplementowany i rozwijany przez programistów (w większości
wywodzących się z systemu UNIX).
Był pierwszym językiem łączącym w sobie cechy, rzadko osiągane we wcześniejszych językach, tj:
Strukturalny kod
Niezależność od sprzętu
Język C++
W latach 1970. i 1980. C stał się dominującym językiem programowania. Skąd więc potrzeba nowego języka programowania?
Rosnąca złożoność programów.
Tym razem zaczęto szukać lepszej metodologii radzenia sobie z bardzo złożonymi programami, a nie nowego języka. Wynikiem tych
poszukiwań była nowa metodologia programowania:
Programowanie zorientowane obiektowo (OOP)
C++ został wymyślony przez Bjarne Stroustrup w 1979 roku w Bell
Laboratory w Murray Hill, New Jersey. Początkowo C++ nazywał się C
with Classes. W 1983 zmieniono nazwę na C++.
Sukces C++ bazował na sukcesie języka C, podobnie jak składnia języka bazowego.
Powstanie języka Java
Powody powstania języka Java: Stworzenie języka niezależnego od platformy sprzętowej
nadającego się także do zastosowań niekomputerowych np.: mikrofalówki, telefony komórkowe, ...
Internet: potrzeba jednolitego i bezpiecznego języka do oprogramowania aplikacji przesyłanych siecią
W 1991 roku w Sun Microsystem, Inc
. po 18 miesiącach James Gosling, Patrick Naughton, Chris Warth, Ed Frank i Mike Sheridanstworzyli pierwszą wersję języka nazwanego wtedy Oak.
Wiosną 1995 roku
oficjalnie ogłoszono powstanie języka nazwanego JavaJava bazuje na składni języków C i C++ oraz na obiektowych
Java: właściwości języka
Aplety i aplikacje
W Javie można tworzyć dwa rodzaje programów: aplikacje i aplety.
Aplikacje to programy, które są uruchamiane na komputerze pod
kontrolą zainstalowanego systemu operacyjnego.
Aplet jest aplikacją zaprojektowaną i stworzoną do przesyłania przez
sieć Internet i wykonywania przez przeglądarki sieciowe.
Bezpieczeństwo
Uruchamianie zwykłych programów pochodzących z internetu wymaga znacznej ostrożności. Aplety języka Java są bezpieczne. W czasie ich uruchamiania zostaje im przydzielony kawałek pamięci komputera. Poza nim aplet nie może korzystać z innych zasobów - czasem
środowisko tego typu nazywa się sandbox.
Niezależność od platformy
Do internetu podłączone są różne typy komputerów i nie tylko. Aplety Javy są uniwersalnymi programami, uruchamialnymi na każdej
Bytecode
Rozwiązanie problemu bezpieczeństwa i niezależności od platformy sprzętowej tkwi w tym, że w wyniku kompilacji programu nie
otrzymujemy kodu wykonywalnego lecz kod zwany bytecode.
Bytecode jest wysoko zoptymalizowanym zbiorem instrukcji
zaprojektowanym do wykonania przez system wykonawczy Javy,
zwany Java Virtual Machine (JVM). JVM jest interpreterem bytecodu. Języki poprzedzające Javę (C i C++) były językami w pełni
kompilowanymi, tj. kompilacja polegała na wyprodukowaniu kodu
wykonywalnego na danej platformie sprzętowej. Co więcej, dla każdej platformy sprzętowej trzeba było wyprodukować kompilator.
W przypadku języka Java sytuacja jest prostsza. Wystarczy
zaimplementować na każdej platformie znacznie prostszą JVM i uruchamiać pod jej kontrolą uniwersalny bytecode.
OOP
koncepcje
Java jest tak silnie związana z OOP, że nie ma możliwości napisania nieobiektowego programu (jak to ma miejsce w C++). Dlatego musimy poznać podstawowe koncepcje OOP zanim przystąpimy do pisania kodu.
Dwie koncepcje programowania:
Model procesowy: program jest serią akcji, tj. kodem,
wykonywanych na danych; model ten jest wykorzystywany w
językach proceduralnych: C, Pascal,...; model jest tym trudniejszy do stosowania im program jest większy i bardziej złożony
Model OOP: program jest zorganizowany wokół danych, tj.
obiektów, a nie akcji, i zbioru dobrze zdefiniowanych interfejsów do
danych; często OOP określa się jako: dane kontrolujące dostęp do
OOP
abstrakcja
Ludzie często używają abstrakcji w życiu radząc sobie w ten sposób ze skomplikowanymi zjawiskami/obiektami. Np.: ludzie nie myślą o samochodzie jako o zbiorowisku dziesiątek tysięcy części, a raczej jak o dobrze zdefiniowanym obiekcie o unikalnym zachowaniu.
Do zarządzania abstrakcją służą klasyfikacje hierarchiczne, pomagające rozbić złożone problemy na prostsze.
Obiekty abstrakcyjne często w rzeczywistości składają się z wielu
komponentów. Np.: obiekt samochód składa się z wielu komponentów (układ kierowniczy, hamulce, silnik, ...) lecz z zewnątrz jest postrzegany jako całość.
Obiekty komponenty mogą porozumiewać się ze sobą przesyłając do siebie komunikaty. Komunikaty te mogą być ukryte przed
OOP
hermetyzacja
Hermetyzacja jest mechanizmem łączącym kod i dane, na których kod
operuje, i chroni je przed niepowołanym dostępem i niewłaściwym użyciem.
Hermetyzacja często jest opisywana jako opakowanie ochronne dla
kodu i danych chroniące je przed dostępem przez kod pochodzący z zewnątrz opakowania. Dostęp do danych i kodu wewnątrz opakowania jest kontrolowany przez zdefiniowany interfejs.
Klasa jest definicją struktury (danych) i zachowania (kodu), które mogą
być wspólne dla wielu obiektów. Każdy obiekt będący instancją danej
klasy posiada struktury i zachowania zdefiniowane w klasie, choć
poszczególne obiekty mogą się różnić strukturami i zachowaniami spoza klasy.
Dane obiektów danej klasy nazywamy zmiennymi instancji,
OOP
klasy
Klasa
Obiekt
Metody prywatnePrywatne zmienne instancyjne Metody publiczne Publiczne zmienne instancyjne (niezalecane)
OOP
dziedziczenie
Dziedziczenie jest mechanizmem nabywania przez jeden obiekt
własności innego obiektu.
Dziedziczenie, podobnie jak abstrakcja wspiera koncepcję klasyfikacji hierarchicznej.
Przykład:
Zwierze
Ssak Ryba
OOP
polimorfizm
Polimorfizm (z greckiego: wiele form) jest własnością pozwalającą
użyć jeden interfejs dla pewnej klasy akcji. Poszczególne akcje są determinowane przez sytuację (środowisko czasu wykonywania).
Przykład: Rozważmy program, w którym potrzebujemy trzech
rodzajów stosów: liczb całkowitych, liczb zmiennopozycyjnych i znaków. Algorytm implementujący każdy stos jest taki sam (push, pop, ...), natomiast różni się danymi, na których operuje. W
zwykłych językach programowania zwykle tworzymy trzy różne implementacje stosów. Używając OOP możemy zaprogramować ogólne zachowanie stosów i stosować je do różnych sytuacji.
Nieformalnie koncepcję polimorfizmu można opisać jako:
Jedna metoda, wiele możliwości wykonania
Wybranie odpowiedniej możliwości wykonania w zależności od kontekstu wywołania jest sprawą kompilatora a nie programisty.
Pierwszy program
class Example{public static void main(String args[]){
System.out.println("To jest prosty program napisany w języku Java");
}
} Patrz plik: Example.java
W języku Java plik zawierający kod programu zazwyczaj nazywa się tak jak zdefiniowana w nim klasa i nazywany jest jednostką kompilacji.
Kompilator Javy wymaga by plik posiadał rozszerzenie .java. Wynikiem kompilacji jest bytecode w pliku o takiej samej nazwie jak definiowana klasa i rozszerzeniu .class.
Kompilacja:
$ javac Example.java Wykonanie: $ java Example
Pierwszy program
wyjaśnienia
class Example{
Słowo kluczowe class oznacza, że tu zaczyna się definicja nowej klasy.
public static void main(String args[]){
Ta linia zaczyna metodę main(). Jest to metoda, która rozpoczyna wykonanie programu.
public jest specyfikacją dostępu do definiowanych elementów. Tu
oznacza, kod spoza klasy ma dostęp do definiowanego elementu. Przeciwnym jest private.
static oznacza, że mamy dostęp do definiowanego elementu bez
konieczności tworzenia obiektu danej klasy.
String args[] definiuje tablicę args elementów klasy String,
będących parametrami wywołania programu.
Kolejne programy
Zobacz plik Example2.java, zawierający proste obliczenia numeryczne. Skompiluj i wykonaj program.
“num = “ + num
Jest wyrażeniem wyliczającym się do obiektu typu String. Wartość
num jest rzutowana na jej reprezentację napisową i doklejona do
końca napisu num =
Zobacz plik IfSample.java, zawierający przykłady użycia instrukcji warunkowej. Skompiluj i wykonaj program.
Zobacz plik ForTest.java, zawierający przykłady użycia pętli iteracyjnej. Skompiluj i wykonaj program.
Zobacz plik BlockTest.java, zawierający przykłady użycia pętli iteracyjnej z blokiem instrukcji. Skompiluj i wykonaj program.