Programowanie.
Wykład 4.
mgr inż. Aleksander Bielski
alex@iis.pwsz.elblag.pl
www.iis.pwsz.elblag.pl/~alex
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
1
Program wykładu
1) Tablice
2) Metoda main()
3)Czas życia zmiennych
4)Inicjalizacja zmiennych
5)Przekazywanie argumentów
6)Odśmiecacz pamięci
7)Operatory logiczne: obliczanie ”na skróty”
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
2
Tablice
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
3
Tablica
– jest to zbiór elementów typów podstawowych,
referencji lub innych tablic.
Wszystkie elementy tablicy muszą mieć ten sam typ (wyjątek
– polimorfizm)
Kroki niezbędne do utworzenia tablicy:
deklaracja
konstruowanie
inicjalizacja
Tablice: deklaracja
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
4
Deklaracja mówi kompilatorowi jaka jest nazwa tablicy i typ
elementów.
Przykłady:
int[] ints;
// tablica typu podstawowego int
double[] dubs;
// tablica typu podstawowego double
Dimension[] dims;
// tablica typu referencyjnego (pakiet awt)
float[][] twoDee;
// dwuwymiarowa tablica
Tablice: deklaracja c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
5
Używanie nawiasów kwadratowych:
●
przed nazwą tablicy
●
po nazwie tablicy
Przykłady:
Deklaracja metody (parametrem jest tablica wartości typu double):
mojaMetoda(double dubs[])
mojaMetoda(double[] dubs)
Deklaracja metody, która zwraca tablicę wartości typu double:
double[] innaMetoda();
double innaMetoda()[];
Tablice c.d
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
6
Pyt. Kiedy jest określany rozmiar tablicy?
Odp. W czasie utworzenia tablicy.
Przykład:
int[] ints;
// Deklaracja
ints = new int[25];
// Utworzenie w czasie wykonywania
Skutki:
●
można określać rozmiar tablicy w czasie wykonywania przy pomocy
zmiennej:
int size = 1152 * 900;
int[] raster;
raster = new int[size];
Tablice c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
7
Deklaracja i utworzenie (definicja) tablicy w jednej linii:
int[] ints = new int[25];
Inicjalizacja:
elementy tablicy przyjmują wartości domyślne dla danego typu danych:
Tblica 4.1 Wartości domyślne zmiennych
Deklaracja, definicja i inicjalizacja tablic
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
8
●
Wszystko w jednej linii:
float[] diameters = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f};
rozmiar tablicy jest określany ilością elementów w nawiasach
●
Inicjalizacja poprzez przypisanie wartości do każdego elementu:
long[] kwadraty;
kwadraty = new long[6000];
for (int i = 0; i < 6000; i++) {
kwadraty[i] = i * i;
}
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
9
Jeśli rozmiar tablicy może się zmieniać, to bezpieczniej jest zmienić linijkę
nr 3 w programie:
short rozmiar;
rozmiar = 6000;
long[] kwadraty;
kwadraty = new long[rozmiar];
for (int i = 0; i <
kwadraty.length
; i++) {
kwadraty[i] = i * i;
}
Deklaracja, definicja i inicjalizacja tablic c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
10
Można tworzyć tablice o kształcie różnym
od prostokąta
W
przypadku
tablic
wielowymiarowych
rozmiar każdej „pod-tablicy” nie musi być
jednakowy
Tablice: kilka uwag
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
11
jest
punktem
wejścia
dla
każdej
aplikacji w Javie
jest statyczna i publiczna
deklaracja:
public static void main(String[] args)
tablica
args
zawiera argumenty, które
mogą być przekazane przez użytkownika z
wiersza poleceń
Metoda main()
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
12
składowe klas
(member variable) – są
tworzone i unicestwiane wraz z obiektem
automatyczne
(lokalne w metodach) – są
tworzone w czasie wejścia do metody,
istnieją przez cały czas wykonania
metody i dostępne tylko w czasie
wykonania metody (wyjątek – metody klas
wewnętrznych)
Wartości domyślne zmiennych które są
składowymi klas są podane w tablicy 4.1.
Czas życia zmiennych
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
13
składowe klas:
1.
class maZmienne {
2.
int x = 20;
3.
static int y = 30;
4.
...}
Inicjalizacja zmiennych nie statycznych
odbywa
się
tuż
przed
wywołaniem
konstruktora danej klasy
Zmienne statyczne są inicjalizowane w
czasie ładowania klasy
Inicjalizacja zmiennych
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
14
Zmienne
automatycznie
nie
są
inicalizowane przez system, dlatego do
nich w sposób jawny muszą być przypisane
wartości:
1.
public int wrong() {
2.
int i;
3.
return i+5;
4.
}
metoda nie da się skompilować: błąd w
linii 3 „
Variable i may not have been
initialized
”.
Inicjalizacja zmiennych c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
15
public double fourthRoot(double d) {
double result;
if (d >= 0)
{
result = Math.sqrt(Math.sqrt(d));
}
return result;
}
wynik kompilacju:
bład „
variable result may not
have been
initialized
”.
Przykład: kod programu znajduje się w katalogu p1
Inicjalizacja zmiennych c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
16
Możliwe rozwiązanie problemu:
public double fourthRoot(double d) {
double result = 0.0;
// Inicjalizacja
if (d >= 0) {
result = Math.sqrt(Math.sqrt(d));
}
return result;
}
Inicjalizacja zmiennych c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
17
Do metody przekazywana jest kopia argumentów typów
prostych:
public void zwieksz(int par) {
par += 15;
}
następnie wywołujemy metodę zwieksz():
int xx = 12345;
zwieksz(xx);
System.out.println(”teraz xx ma wartosc: ” + xx);
Pyt. Jaki będzie oczekiwany wynik?
Przekazywanie argumentów
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
18
Przekazywany jest nie obiekt, tylko referencja
Zmiana parametru formalnego powoduje zmianę
wartości argumentu wywołania
class Test {
int a, b;
Test(int i, int j) {
a = i;
b = j;
}
void metoda(Test o) {
o.a *= 2; o.b /= 2;
}
}
Przekazywanie obiektów
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
19
class WywolaniePrzezNazwe {
public static void main(String args[]) {
Test o = new Test(10, 20);
System.out.println(” przed wywolaniem: ”
+ o.a + ” ” + o.b);
o.metoda(o);
System.out.println(” po wywolaniu: ”
+ o.a + ” ” + o.b);
}
}
Przykład: kod programu znajduje się w katalogu p2.
Przekazywanie obiektów: przykład
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
20
Problem:
Jak przekazać zmienne typów podstawowych przez
referencje?
Rozwiązanie:
Utworzenie tablicy jednoelementowej i przekazanie
jej w wywołaniu metody
Przykład:
program p3/Test.java
Referencje do zmiennych typów podstawowych
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
21
Referencje do zmiennych typów podstawowych
public class Test {
public static void main(String args[]) {
int [] tab = { 1 };
zmien(tab);
System.out.println("tab ma wartosc " + tab[0]);
zmien(tab);
System.out.println("tab ma wartosc " + tab[0]);
}
public static void zmien(int [] wartosc) {
wartosc[0]++;
}
}
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
22
Odśmiecacz pamięci
●
Działa jako oddzielny wątek
●
nie można stwierdzić jak często jest
uruchamiany
●
dobrym nawykiem jest przypisanie wartości
null do zmiennych typów referencyjnych
których już nie chcemy używać w programie
●
metody
System.gc()
i
Runtime.gc()
„sugerują”
wirtualnej
maszynie
Javy
uruchomienie odśmiecacza pamięci
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
23
Obliczanie ”na skróty”
●
Dotyczy operatorów logicznych
&&
i
||
wykonujących logiczne AND i OR na
wartościach typu
boolean
●
Dla operacji
AND
, jeśli jeden z operandów
ma wartość false, wynik również ma wartość
false niezależnie od wartości drugiego
operanda
●
Dla operacji
OR
, jeśli jeden z operandów
ma wartość true, wynik również ma wartość
true niezależnie od wartości drugiego
operanda
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
24
Obliczanie ”na skróty” c.d.
Inaczej mówiąc dla dowolnej
wartości
X
typu boolean:
●
false
AND
X
= false
●
true
OR
X
= true
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
25
Obliczanie ”na skróty” : przykłady
if
(s != null)
{
if
(s.length() > 20)
{
System.out.println(s);
}
}
lub ten sam kod zapisany inaczej:
if
(
(s != null)
&&
(s.length() > 20)
)
{
System.out.println(s);
}
}
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
26
Obliczanie ”na skróty” - efekt uboczny
Obliczanie tylko części wyrażenia może
powodować efekt uboczny.
Przykłady: programy p4/logika.java
p4/logika2.java
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
27
Operator przypisania
Nadaje zmiennej lub wyrażeniu nową wartość.
Forma skrócona:
x
op=
y oznacza x
=
x
op
y
gdzie
op
oznacza jedną z operacji
+, -,
*, /, %, <<, >>, >>>, &, |, ^
Różnice:
●
jeśli wyrażenie x powoduje efekt uboczny,
to objawia on się jednokrotnie
●
operator przypisania zawiera niejawny
operator rzutowania
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
28
Operator przypisania c.d.
byte x = 2;
x += 3;
jest równoznaczne z :
byte x = 2;
x = (byte) (x + 3);
rzutowanie odbywa się w sposób niejawny,
inaczej wynik będzie typu int
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
29
Przykładowy test