Kurs Komputerowy Java
Total Page:16
File Type:pdf, Size:1020Kb
Kurs Komputerowy Java http://www.fizyka.umk.pl/~piotra/dydaktyka/Java Piotr Ablewski Katedra Informatyki Stosowanej Instytut Nauk Technicznych Wydział Fizyki Astronomii i Informatyki Stosowanej Uniwersytet Mikołaja Kopernika w Toruniu mgr inż. Piotr Ablewski www.fizyka.umk.pl/~piotra e-mail: piotra@fizyka.umk.pl lub [email protected] Discord: https://discord.gg/84yCUWz ← kurs_komputerowy_java Telegram: https://t.me/PiotrA_KIS_UMK Konsultacje: środa 12:00 - 14:00 lub w dowolnym umówionym mailowo terminie - jestem dostępny od poniedziałku do piątku od 12:00 do 20:00, za wyjątkiem czasu, gdy prowadzę zajęcia. Gdzie mnie szukać: pokój 571 (na przeciwko wejścia do PK1 i PK2) Zasady zaliczenia przedmiotu ● Obowiązkowa obecność na laboratoriach - dopuszczalne dwie nieobecności nieusprawiedliwione ● Na ostateczną ocenę składa się: ○ Kolokwium - 30% wkładu do oceny [termin zostanie ustalony] ○ Projekt zaliczeniowy - 40% wkładu do oceny [tematy zostaną podane w ok. ¾ zajęć] ○ Praca na zajęciach - 30% wkładu do oceny [bieżąca praca polegająca na realizacji zadań] ● W ramach zajęć można otrzymać łącznie max. 100 pkt., z czego 50 pkt. niezbędnych jest do otrzymania zaliczenia Java początki prac: 1991 r. pierwsze informacje: 1995 r. pierwsza wersja dostępna publicznie: 1996 r. Twórca: James Gosling @ Sun Microsystems (współpraca: Mike Sheridan, i Patrick Naughton) Project Green -> Oak -> Java Obecnie Java rozwijana jest przez firmę Oracle (w 2010 roku Sun został przejęty przez Oracle) Założenia twórców 1) Język w pełni obiektowy, tak dobry i szybki jak C++, ale dużo łatwiejszy w wytwarzaniu oprogramowania 2) Write once, run anywhere - maszyna wirtualna 3) Uniwersalny język ogólnego przeznaczenia Założenia twórców 1) Język w pełni obiektowy, tak dobry i szybki jak C++, ale dużo łatwiejszy w wytwarzaniu oprogramowania i o bardziej klarownej składni 2) Write once, run anywhere - maszyna wirtualna 3) Uniwersalny język ogólnego przeznaczenia Zastosowanie 1) Odbiorniki telewizyjne 2) Aplikacje okienkowe 3) Aplikacje mobilne (JavaME - Siemens, Nokia, Sony Ericsson, Android) 4) Aplikacje webowe 5) Aplikacje serwerowe 6) Programowanie sieciowo-komunikacyjne 7) Dydaktyka sieci komputerowych i systemów operacyjnych ( olbrzymie wsparcie Sun’a a następnie Oracle’a) Siemens SL45i - pierwszy telefon obsługujący Java ME Java, JVM, JRE, Java ME, Java EE - o co chodzi? Java - język programowania JVM - Java Virtual Machine - maszyna wirtualna, na której uruchamiać można oprogramowanie napisane w językach: ● Java ● Scala ● Kotlin ● Groovy ● Clojure ● JRuby (Ruby) ● Jython (Python) Java, JVM, JRE, Java ME, Java EE - o co chodzi? Platformy Java: ● Java Standard Edition (Java SE) - aplikacje uruchamiane w konsoli lub aplikacje okienkowe ● Java Enterprise Edition (Java EE) - aplikacje serwerowe ● Java Micro Edition (Java ME) - aplikacje mobilne lub działające na urządzeniach o niskiej wydajności ● Java FX - aplikacje RIA (rich internet applications) oraz aplikacje okienkowe ● Java Card - mikro aplikacje uruchamiane na kartach elektronicznych Platforma Java to zbiór bibliotek i narzędzi umożliwiających lub ułatwiających tworzenie oprogramowania dla konkretnych zastosowań. Java, JVM, JRE, Java ME, Java EE - o co chodzi? JRE - Java Runtime Environment - środowisko uruchomieniowe dla aplikacji napisanych w języku Java, na które składa się JVM + podstawowe klasy pomocnicze (minimum do uruchomienia programu w Javie). JDK - Java Development Kit - darmowe oprogramowanie udostępniające środowisko niezbędne do programowania w języku Java, składające się z : ● javac – kompilatora ● jar – archiwizatora ● javadoc – generatora dokumentacji ● javah – generatora plików nagłówkowych ● javap – deasemblera ● jdb – debuggera Skąd i co pobrać JRE: https://www.java.com/pl/download/ JDK + Docs: https://www.oracle.com/java/technologies/javase-downloads.html Implementacje Java i biblioteki ● OpenJDK: 2006 - 2014 @ GNU GPL ● HotSpot (JRE): 1999 - obecnie, od 2006 r. @ GNU GPL ● KVM: Kilobyte Virtual Machine stworzona dla urządzeń wyposażonych w procesory 16- i 32-bitowe, pracujące z częstotliwością 12 - 60 MHz, oraz min. 128 kB pamięci RAM ● Kaffe ● Apache, IBM, RedHat Foundation itp. Zainteresowanym polecam zajrzeć tutaj: https://en.wikipedia.org/wiki/List_of_Java_virtual_machines IDE - Netbeans IDE - Eclipse IDE - IntelliJ IDEA IDE - Visual Studio Code IDE - VIM lub Emacs lub Nano/Pico lub mcedit Kolejna mała wojenka... Zajęcia 3. Mechanizmy programowania obiektowego Definicja klasy Complex.java Definicja paczki package com.UMK; public class Complex Nazwa klasy { private double re; private double im; Pola klasy public Complex() { Konstruktor this.re = 0.0; this.im = 0.0; } Metody klasy public Complex(double re, double im) { this.re = re; this.im = im; } ... } Instancjonowanie klasy Main.java package com.UMK; public class Main { public static void main(String[] args) Klasa - definicja, jak wyglądać ma { obiekt // poprzez ładowanie klasy Class klasa_complex = Class.forName("Complex"); Complex a = klasa_complex.newInstance(); Obiekt - instancja klasy; niezależny byt klasy, mający przypisane swoje // poprzez new miejsce w pamięci Complex z = new Complex(); } } Modyfikatory dostępu 1. public - klasa, pole lub metoda jest dostępna publicznie 2. private - pola i metody nie są widoczne poza klasą, klasa prywatna nie jest widziana poza modułem, w którym jest zdefiniowana 3. protected - pola i metody dostępne są dla danej klasy i jej podklas oraz innych klas w tym samym pakiecie; modyfikator nie jest dostępny dla klasy Domyślnie klasy, pola i metody przyjmują modyfikator package private (default) - element widoczny będzie tylko w ramach pakietu, w którym jest zadeklarowany! Modyfikatory dostępu - cel Głównym celem modyfikatorów dostępu jest enkapsulacja (hermetyzacja), czyli ukrycie szczegółów dotyczących implementacji klasy. Dzięki temu ostateczny użytkownik klasy ma dostęp tylko do ściśle określonych funkcjonalności. W przypadku dziedziczenia - można budować skomplikowane relacje między obiektami. Zasady stosowania modyfikatorów dostępu: ● stosowanie jak najbardziej restrykcyjnych modyfikatorów dostępu (w praktyce - pola private, metody public lub private, w zależności od tego, czy użytkownik ma mieć możliwość bezpośredniego wywołania metody, czy też nie) ● tworzenie setterów i/lub getterów dla prywatnych pól, celem ich “odkrywania” Pola klasy - zakres Pola klasy dostępne są wewnątrz obiektu i na zewnątrz (jeśli pozwala na to modyfikator lub mamy zdefiniowany getter). Pola domyślnie nie są współdzielone przez obiekty - każdy obiekt ma swój zestaw pól, którym przypisane są konkretne dla niego wartości. Pola można współdzielić między obiektami tej samej klasy poprzez użycie słówka kluczowego static przy definicji pola, np.: public static int a = 0; Takie pole można wykorzystać np. jako zmienną przechowującą liczbę instancji danego obiektu. Metody statyczne Metoda oznaczona jako static pozwala wywoływać się bez konieczności instancjonowania klasy. Można dzięki temu stworzyć klasę, która pozwalać będzie na wywoływanie z niej funkcji (np. klasa Math nie może być instancjonowana, ale można z niej wołać stałe ( Math.E i Math.PI ) oraz metody zwracające wartości funkcji (np. Math.abs(x) zwróci moduł liczby x, która może być typu int, long, float lub double). Podstawową metodą statyczną jest metoda main, której implementacja wygląda następująco: public static void main(String[] args) { … } Oznacza to, że uruchomienie programu nie jest związane z żadnym obiektem. Na początku mamy tylko główną klasę Main i w ramach metody main(), będącej punktem wejścia programu, implementujemy całą logikę. Nigdzie nie wołamy bezprośrednio konstruktora klasy Main i nie wywołujemy na obiekcie tej klasy metody main(). Klasy statyczne Metody statyczne wykorzystuje się jako substytut zwykłych funkcji, które można wywołać bez konieczności tworzenia obiektu. Bardzo często buduje się klasy statyczne oparte na metodach statycznych, które działają jak wspomniana wcześniej klasa Math. W pełni statyczna klasa nie może dać się instancjonować, a nie można użyć w jej definicji słowa static. Efekt ten uzyskuje się poprzez prywatny konstruktor. Main.java ComplexMath.java package com.UMK; package com.UMK; public class ComplexMath public class Main { { private ComplexMath() { } public static void main(String[] args) { public static double module( Complex z ) Complex x = new Complex(); { ComplexMath.module(x); return Math.sqrt(z.getRe()*z.getRe() + z.getIm()*z.getIm()); } } } } Klasy statyczne - cd W języku Java istnieje jeden przypadek, gdzie do definicji klasy można dodać słowo static - tworzyć można zagnieżdżone klasy statyczne (ang. inner class) - w tym przypadku do ich instancjonowania nie ma potrzeby, aby w pierwszej kolejności instancjonować klasę zewnętrzną. Oczywiście taka klasa wewnętrzna ma dostęp jedynie do statycznych pól i metod klasy zewnętrznej. Jest to kolejny sposób na jeszcze szczelniejszą enkapsulację. Klasa zagnieżdżona statyczna Klasa zagnieżdżona public class Foo { public class Foo { public class Bar{ } public static class Bar{ } } } public class Main { public class Main { public static void main(String[] args) public static void main(String[] args) { { Foo foo = new Foo(); Foo.Bar Bar = new Foo.Bar(); Foo.Bar Bar = new Foo.new Bar(); } } } } Metody statyczne - pułapki Z poziomu metody statycznej nie możemy wywołać metody stricte obiektowej, bo musi być ona związana z konkretną instancją klasy. Aby obejść ten problem, wewnątrz metody statycznej tworzy się instancję klasy i dopiero na stworzonym obiekcie wywołuje się metodę obiektową.