Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...



Podobne dokumenty
Programowanie obiektowe

Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Wykład 7: Pakiety i Interfejsy

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wykład 4: Klasy i Metody

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Definicje klas i obiektów. Tomasz Borzyszkowski

Dokumentacja do API Javy.

Języki i metody programowania Java. Wykład 2 (część 2)

Wykład 2: Podstawy Języka

Podstawy programowania obiektowego

Programowanie w Internecie. Java

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Multimedia JAVA. Historia

1 Atrybuty i metody klasowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Rozdział 4 KLASY, OBIEKTY, METODY

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Enkapsulacja, dziedziczenie, polimorfizm

Definiowanie własnych klas

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Materiały do zajęć VII

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe


Programowanie obiektowe

Programowanie obiektowe

KLASY, INTERFEJSY, ITP

Programowanie w Javie - wykład 2

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Programowanie obiektowe

Wykład 8: klasy cz. 4

Wykład 5: Więcej o Klasach i Metodach

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Kurs WWW. Paweł Rajba.

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

PARADYGMATY PROGRAMOWANIA Wykład 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Pakiety i interfejsy. Tomasz Borzyszkowski

Programowanie obiektowe

Programowanie obiektowe

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Programowanie obiektowe

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Dziedziczenie. dr Jarosław Skaruz

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Java Język programowania

JAVA- wykład 2 Klasy

Platformy Programistyczne Wykład z Javy dla zaawansowanych

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Podstawy programowania obiektowego

Podstawy Języka Java

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Interfejsy i klasy wewnętrzne

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

.NET Klasy, obiekty. ciąg dalszy

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Programowanie obiektowe

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Aplikacje w środowisku Java

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Programowanie obiektowe w języku

Polimorfizm. dr Jarosław Skaruz

Ćwiczenie 1. Przygotowanie środowiska JAVA

Programowanie Obiektowe i C++

Zaawansowane programowanie w języku C++ Klasy w C++

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Definiowanie własnych klas

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Aplikacje RMI

Wykład 8: Obsługa Wyjątków

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Transkrypt:

Java niezbędnik programisty spotkanie nr 3 Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja... 1

Definicja klasy [modyfikator] class nazwa_klasy { [modyfikator] nazwa_typu [=wyrażenie_inicjalizujące]; [modyfikator] typ_zwr nazwa_met([arg]) [klauzula_throw] { kod_metody 2

Modyfikatory Modyfikatory dostępu: public, protected, (domyślny dostęp pakietowy), private (słowo default ma inne zastosowanie) Modyfikatory dostępu używamy z klasami, interfejsami, atrybutami, metodami, konstruktorami i klasami wewnętrznymi. Nie wszystkie modyfikatory stosują się do każdego zagadnienia, np. klas dotyczą jedynie public i (domyślny dostęp pakietowy) Pozostałe modyfikatory: abstract (klasa, metoda), final (klasa, metoda, zmienna), native (metoda), static (metoda, atrybut), synchronized (metoda), volatile (zmienna), transient (atrybut), strictfp (klasa, metoda) 3

Modyfikatory - przykład package niezbednik3; import jakies.klasy.*; //kolejność definicji klas jest nieistotna public class Test { public static void main(string[] args) { Modyfikatory modyf = new Modyfikatory(); modyf.a = 1; modyf.b = 2; modyf.c = 3; //modyf.d = 4; //klasy mogą mieć jedynie dostęp pakietowy lub public class Modyfikatory { public int a; protected int b; int c; private int d; 4

Modyfikatory - przykład package niezbednik3; import jakies.klasy.*; public class Test { public static void main(string[] args) { inny.pakiet.modyfikatory modyf; modyf = new inny.pakiet.modyfikatory(); modyf.a = 1; //modyf.b = 2; //modyf.c = 3; //modyf.d = 4; ------------------------------------------------------------- package inny.pakiet; public class Modyfikatory { public int a; protected int b; int c; private int d; 5

Kontrola jest w chwili kompilacji Modyfikatory ograniczają dostęp na poziomie kodu. To nie jest mechanizm kontroli uprawnień na poziomie obiektów. class SłużbySpecjalne { private String nazwiskoagenta; protected String inwigiluj(służbyspecjalne ss) { return ss.nazwiskoagenta; System.out.println(ssKraj2.inwigiluj(ssKraj1)); Dzięki temu kontrolę może przeprowadzić kompilator! Jak to nie wystarcza, to są języki aspektowe. 6

Jednostki kompilacji Programy w Javie składają się z jednostek kompilacji plików z kodem źródłowym. Pliki z kodem źródłowym mają rozszerzenie.java Każdy plik z kodem źródłowym może zawierać co najwyżej jedną publiczną klasę lub interfejs. Jeżeli zawiera - plik musi się nazywać tak samo jak klasa/interfejs. Jeżeli nie zawiera - może się nazywać dowolnie. 7

import Pomiędzy deklaracją pakietu i deklaracjami klas i interfejsów możemy wskazać jakich klas i interfejsów chcemy używać bez kwalifikowania ich nazw nazwą pakietu: import pak1.pak2.klasa; import pak1.interfejs; import pak1.*; //nie obejmuje podpakietów //java.lang.* jest importowane domyślnie JVM ładuje potrzebne klasy w chwili pierwszego odwołania, a odnajduje je dzięki wartości CLASSPATH (zmienna środowiska lub parametr wywołania). Jeżeli CLASSPATH=/java:. to poszukiwany będzie plik /java/pak1/pak2/klasa.class, jeżeli taki nie istniej to./pak1/pak2/klasa.class. W CLASSPATH można też wskazać archiwum (jar lub zip). Nie znalezienie importowanej klasy/interfejsu powoduje błąd podczas kompilacji. 8

import c.d. Jeżeli pakiety pak1 i pak2 zawierają klasę A to: import pak1.a; import pak2.a; spowoduje błąd podczas kompilacji import pak1.*; import pak2.a; będzie poprawne i używana będzie A z pak2, chyba że A jest również definiowana w aktualnym pakiecie import pak1.*; import pak2.*; będzie poprawne, o ile nigdzie nie próbujemy odwoływać się do A i nie definiujemy tej klasy w aktualnym pakiecie 9

Przeciążanie metod Metody odróżniamy na podstawie nazwy i listy parametrów Nazwy jakie nadamy parametrom nie mają znaczenia, liczą się jedynie ich typy public void mojametoda(string jakaśnazwa) public void mojametoda(string innanazwa) Czasami metody wykonujemy jedynie dla ich efektów ubocznych, a zwracana wartość nas nie interesuje (więc nie służy do odróżniania metod przeciążonych) space.write(entry, transaction, lease); dodaj(4, 5); //4+5; //nie skompiluje się 10

Przeciążanie metod - przykład 1 class PrzeciazanieMetod { void f(char x) {System.out.println("char"); void f(byte x) {System.out.println("byte"); void f(short x) {System.out.println("short"); void f(int x) {System.out.println("int"); void f(long x) {System.out.println("long"); void f(float x) {System.out.println("float"); void f(double x) {System.out.println("double"); //void f(object o) {System.out.println("Object"); //void f(string s) {System.out.println("String"); char jest promowany do int (do short nie) dla obiektów wybierany jest typ bardziej szczegółowy 11

Przeciążanie metod - przykład 2 class PrzeciazanieMetod { void f(short b, int i) {System.out.println("short, int"); void f(int b, short i) {System.out.println("int, short"); //pm.f(1, 1); //żadna metoda nie pasuje //pm.f((short) 1, (short) 1); //pasują obie pm.f(1, (short) 1); //int, short pm.f((char) 1, (byte) 1); //int, short 12

Tworzenie/inicjalizacja obiektów Użytkownicy naszych bibliotek nie zawsze będą świadomi, że obiekty należy zainicjalizować. Inicjalizacja jest tak ważna, że warto mieć specjalną metodę - konstruktor, która jest automatycznie wywoływana zaraz po stworzeniu obiektu. Konstruktory mają taką samą nazwę jak klasa (pierwsza litera jest wielka). Konstruktory można przeciążać. Ponieważ konstruktor jest wywoływany w chwili użycia operatora new, to nie ma sensu, żeby miał wartość zwrotną. Każda klasa musi mieć konstruktor, jeżeli żadnego nie zdefiniowaliśmy kompilator doda za nas domyślny, pusty, bezparametrowy. Pierwszą operacją w konstruktorze może być wywołanie innego konstruktora (ale nie mogą powstać cykle).

Tworzenie/inicjalizacja obiektów package niezbednik3; import java.util.*; class TestKonstruktora { Date d; TestKonstruktora() { d = new Date(); class TestKonstruktora2 { Date d; //domyślny bezparametrowy konstruktor jest dodawany jedynie //jeżeli sami żadnego nie zdefiniowaliśmy TestKonstruktora tk = new TestKonstruktora(); TestKonstruktora2 tk2 = new TestKonstruktora2(); 14

Tworzenie/inicjalizacja obiektów class TestKonstruktora3 { Date d; TestKonstruktora3(Date d) { this.d = new Date(); //bezparametrowe konstruktory są ważne jak przekazujemy //nasze klasy do ogólnych bibliotek TestKonstruktora3() { this(new Date()); //wywołanie innego konstruktora... 15

Zwalnianie zasobów W Javie nie ma żadnych jawnych bądź niejawnych destruktorów. Zasoby inne niż pamięć przyjęło się zwalniać w metodzie close() (trzeba ją samemu definiować i wywoływać) plik.close(); gniazdo.close(); połączeniezbazą.close(); Nie musimy/możemy się martwić o zwalnianie pamięci, w której przechowywane są Javowe obiekty (sterta) i zmienne (stos), bo sami jej nie przydzielamy. O obiektach, których już nie będziemy potrzebować można zwyczajnie zapomnieć: { String s = "ala"; System.out.println(s); 16

Odśmiecanie/Finalizacja Zwalnianiem pamięci po obiektach zajmuje się odśmiecacz. Odśmiecenie może nastąpić jedynie, jeżeli dany obiekt nie jest dostępny z żadnego aktywnego wątku programu. Za jego uruchamianie i stosowane algorytmy odpowiada maszyna wirtualna. Użytkownik może jej jedynie "podpowiedzieć, że warto podjąć starania w celu odśmiecenia pamięci": System.gc(). Jeżeli pamięci jest dużo, odśmiecanie może nie być potrzebne. Przed odśmieceniem danego obiektu wywoływana jest odziedziczona po Object metoda finallize(). O finallize() wiadomo, że będzie wywołana co najwyżej raz, dlatego nie ma sensu zwalniać w niej jakichkolwiek zasobów. Można natomiast sprawić, że obiekt stanienie się ponownie dostępny. Jako ćwiczenie proszę sprawdzić, czy przed odśmieceniem (po raz drugi) przywróconego obiektu finallize() będzie wywołana drugi raz. 17

Finalizacja - Przykład class Finalizacja { int n; String[] smieci; Finalizacja(int n) { this.n = n; smieci = new String[n]; smieci[0] = "Każda literka zaśmieca dwa bajty."; for (int i=1; i<n; i++) smieci[i] = smieci[i-1] + smieci[i-1]; protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize() dla n=" + n); 18

Finalizacja Przykład c.d. Wywołanie: for (int i=1; i <= 13; i++) { Finalizacja f = new Finalizacja(i); Może dać następujący wynik: finalize() dla n=9 finalize() dla n=10 finalize() dla n=12 19

Jak działa odśmiecacz Odnajdywanie niedostępnych obiektów: zliczanie referencji (znajdywanie grup obiektów odwołujących się do siebie na wzajem jest kosztowne) przeglądanie sieci dostępnych (przez stos) obiektów i jakoś ich oznaczanie Porządkowanie sterty: stop-and-copy - odśmiecamy i porządkujemy (przesuwamy obiekty dbając o naprawianie referencji); strategia dobra jak dużo odśmiecania mark-and-sweep jedynie odśmiecamy; strategia dobra jak mało odśmiecania stop-and-copy można udoskonalić dzieląc stertę na bloki i umieszczając w każdym licznik jego wykorzystania. Maszyna wirtualna może przełączać strategie w zależności od własności działającego programu. 20

Inicjalizacja c.d. class Pom1 { Pom1() {System.out.println("Pom1()"); class TestInicjalizacji { int x = 777; Pom1 p = new Pom1(); int y = f(); int f() { System.out.println("f()"); return 1; //deklaracje metod mogą się przeplatać z deklaracjami atrybutów int yy; TestInicjalizacji() { System.out.println("TestInicjalizacji()");... kolejność: Pom1(), f(), TestInicjalizacji() 21

Inicjalizacja c.d.... //kolejność deklaracji zmiennych ma znaczenie przy inicjalizacji int v = x; //int a = b; int b; //kolejność jest też istotna przy przekazywaniu parametrów //int a = b(u); int b(int u) { return u; int u;... 22

Inicjalizacja c.d.... //można jednak oszukiwać int z = h(); int h() { System.out.println("h(); u="+u); return u; int u = 1313; //to by się skompilowało!!! //ale zawsze dojdzie do przepełnienia stosu (StackOverflowError) //TestInicjalizacji ti = new TestInicjalizacji();... wynik: h(); u=0 23

Inicjalizacja statyczna Inicjalizacja składowych statycznych odbywa się jeden raz, w momencie pierwszego użycia klasy (odwołanie do składowej statycznej lub utworzenie obiektu). class InicjalizacjaStatyczna { static Pom1 p = new Pom1(); static void test() {System.out.println("test()"); InicjalizacjaStatyczna.test(); InicjalizacjaStatyczna is = new InicjalizacjaStatyczna(); Class c = InicjalizacjaStatyczna.class; 24

Grupowanie inicjalizacji class BlokInicjalizacji { int x; //o wyjątkach jeszcze opowiemy { try { System.out.println("ustawiam x"); x = 7; catch (Exception e) { System.out.println("Wpadłeś jak śliwka w studzienkę kanalizacyjną"); static int y; static { int pom; pom = 1; System.out.println("ustawiam y"); y = pom; Kolejność od góry na dół. Inicjalizacja statyczna i niestatyczna będzie poprzeplatana. 25