3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 1
3. Klasy w
java.lang
3.1 Pakiet
java.lang
3.2 Klasy
Character, String, StringBuffer
3.3 Klasy dla typów liczbowych
3.4 Tablice
3.5 Klasa
System
3.6
Security Manager
3.7
Runtime
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 2
3.1 Pakiet
java.lang
Wa
ż
niejsze klasy pakietu
java.lang
:
•
Object
- klasa główna.
•
Class
- zapewnia opis klas podczas wykonania programu.
•
Klasy "opakowuj
ą
ce" typy liczbowe:
Boolean, Character, Integer, Long, Float, Double
•
Void
- abstrakcyjna klasa zawiera referencje do obiektu typu
Class
dla
typu prostego
void
.
•
Math
- zawiera funkcje matematyczne, np.
sin, cos, square root, min,
max
;
generator pseudolosowy
random().
•
String , StringB
uffer - operacje na napisach.
•
ClassLoader, Process, Runtime, SecurityManager, System
- realizacja
"operacji systemowych" jak: dynamiczne ładowanie klas, tworzenie
zewn
ę
trznych procesów, zapytania o wasno
ś
ci systemowe i
stosowanie zabezpiecze
ń
.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 3
•
Throwable
- klasa obiektów, które mog
ą
by
ć
zgłaszane we frazie
throw
.
Klasa bazowa klas bł
ę
dów i wyj
ą
tków.
•
Thread, ThreadGroup
- klasy dla definiowania wielow
ą
tkowego
zachowania si
ę
programu.
Opis interfejsów:
•
CharSequence
- sekwencja znaków która mo
ż
e by
ć
odczytana.
•
Cloneable
- klasa implementuj
ą
ca ten interfejs deklaruje (co jest
potrzebne metodzie
Object.clone()
)
,
ż
e mo
ż
na na jej obiektach
wykona
ć
kopiowanie pól składowa-po-składowej.
•
Comparable
- wskazuje na istnienie globalnego uporz
ą
dkowania
obiektów klasy implementuj
ą
cej interfejs.
•
Runnable
- ka
ż
da klasa „typu w
ą
tek” powinna implementowa
ć
metod
ę
tego interfejsu.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 4
3.2 Klasy
Character, String, StringBuffer
Klasy znakowe:
Character (pojedynczy znak)
String (niezmienne napisy)
StringBuffer (zmienne napisy)
Klasa Character
- jeśli potrzebny jest obiekt zawierający pojedynczy znak a nie
zmienna typu char.
W poniższym przykładzie wywołuje się
metody klasy Character
:
Character(char) - jedyny konstruktor klasy
compareTo(Character) - porównuje argument z obiektem
equals(Object) - porównuje wartości obiektów
toString() - konwertuje obiekt do napisu 1-znakowego
charValue() - zwraca znak przechowywany w obiekcie
isUpperCase(char) - metoda statyczna, testująca czy argument jest
"górnym" znakiem .
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 5
Przykład 3.1
public class CharacterDemo {
public static void main(String args[]) {
Character a = new Character('a');
Character a2 = new Character('a');
Character b = new Character('b');
int difference = a.compareTo(b);
if (difference
==
0) {
System.out.println("a jest równe b.");
} else if (difference <0) {
System.out.println("a jest mniejsze od b.");
} else if (difference >0) {
System.out.println("a jest większe od b.");
}
System.out.println("a jest " +
((a.equals(a2)) ? "równe" : "nierówne") + " a2.");
System.out.println("Znak " + a.toString() + " jest "
+ (Character.isUpperCase(a.charValue()) ? "górnym " : "dolnym ")
+ "znakiem.");
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 6
}
}
Wynik programu:
a jest mniejsze od b.
a jest równe a2.
Znak a jest dolnym znakiem.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 7
Klasa String -
String jest klasą w Javie a nie typem literału napisowego
zakończonego znakiem końca literału \0.
Przykład 3.2
class strcpy {
public static void main(String[] args) {
String s = "HotJava is Cool!";
StringBuffer t = new StringBuffer("Java is Cool!");
System.out.println(s + ", " + t);
myStrCopy(t, s);
System.out.println(s + ", " + t);
}
static void myStrCopy ( StringBuffer dest, String src ) {
int i, len = src.length();
for (i = 0; i < len; i++)
dest.setCharAt ( i, src.charAt(i) );
}
}
Ponieważ nie sprawdzamy długości dest to gdy src jest dłuższe od dest
zgłoszony zostanie wyjątek:
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 8
Exception in thread "main":
java.lang.StringIndexOutOfRangeException
Klasa StringBuffer
- Klasa String przeznaczona jest dla obiektów stałych, a
klasa StringBuffer dla obiektów o zmiennej wartości.
Przykład 3.3
public class StringsDemo {
public static void main(String[] args) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
StringBuffer dest = new StringBuffer(len);
for (int i = (len - 1); i = 0; i--) {
dest.append(palindrome.charAt(i));
}
System.out.println(dest.toString());
}
}
Wynik programu:
doT saw I was toD
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 9
Tworzenie obiektów klas String i StringBuffer
Obiekt klasy String można utworzyć:
- przekazując literał napisowy podczas inicjalizacji zmiennej referencyjnej, np.
String palindrome = "Dot saw I was Tod";
// Inicjalizacja literałem
albo
- stosując konstruktor klasy w operatorze new, np.:
char[] helloArray = { 'h', 'e', 'l', 'l', 'o' };
// Tablica znaków
String helloString = new String( helloArray );
// Konstruktor otrzymuje
// tablicę znaków
System.out.println ( helloString );
Obiekt klasy StringBuffer tworzy się operatorem new , np.:
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
StringBuffer dest = new StringBuffer(len);
// Nowy obiekt posiada
// początkową rezerwację pamięci dla napisów o długości len.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 10
Metody dostępu do składowych klas String i StringBuffer
length()
- zwraca liczbę znaków zawartych w obiekcie klasy String lub
StringBuffer. Np.:
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
// len = 17
capacity()
(tylko dla StringBuffer)
Zwraca rozmiar zaalokowanego obszaru dla znaków obiektu, np.
charAt(int)
- zwraca znak o podanym indeksie: 0; 1, ..., length() - 1.
String anotherPalindrome = "Niagara. O roar again!";
char aChar = anotherPalindrome.charAt(9);
// zwróci znak 'O'
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 11
String substring(int);
String substring(int, int);
Zwraca nowy obiekt String będący podnapisem obiektu String lub StringBuffer
- 1-szy argument podaje indeks pierwszego znaku, drugi argument - indeks
znaku ostatniego zwiększony o 1 (długość=arg2 - arg1).
Np.
String anotherPalindrome = "Niagara. O roar again!";
String roar = anotherPalindrome.substring(11, 15);
append(string)
(tylko w StringBuffer) - dołączenie napisu - wymaga
ewentualnego rozszerzenia pamięci zaalokowanej dla znaków obiektu.
Przykład 3.4
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 12
StringBuffer dest = new StringBuffer(len);
for (i = (len - 1); i >= 0; i--) {
dest.append(source.charAt(i));
// Dołącz znak
}
return dest.toString();
}
}
Istnieje szereg metod append(typ), dla typów takich, jak float, int, boolean, a
także Object - dane są konwertowane do literału napisowego przez dołączeniem
ich do obiektu.
insert(int, string)
(tylko w StringBuffer) - wstaw napis w (środek) znaków
obiektu, przed znakiem o indeksie równym 1-szemu argumentowi.
Np.
StringBuffer sb = new StringBuffer("Drink Java!");
sb.insert(6, "Hot ");
// Wstaw napis
System.out.println(sb.toString());
Wydruk programu:
Drink Hot Java!
Tu również istnieje wiele wersji tej metody.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 13
setCharAt(int, znak)
(w StringBuffer)
Zastąp znak w obiekcie w podanym miejscu podanym znakiem.
Metody dla konwersji typu do klasy String
•
String toString (obiekt);
Konwersja obiektu określonego typu na obiekt klasy String.
Przykład 3.5
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);
for (i = (len - 1); i >= 0; i--) { dest.append(source.charAt(i)); }
return dest.toString();
// Konwersja obiektu dla wyniku metody
}
}
Metoda toString() dziedziczona jest z klasy Object i każda klasa może
posiadac własną wersję tej metody.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 14
•
String valueOf (zmienna);
(Metoda klasowa w klasie String). Konwersja zmiennej dowolnego typu
(prostego) do obiektu klasy String.
Np.
System.out.println( String.valueOf(Math.PI) );
Konwersje z klasy String do typów liczowych
•
typ_liczbowy valueOf(string)
Klasa String nie posiada metod konwersji typów w drugą stronę - z typu String
do typów liczbowych. Ale klasy "obejmujące" typy proste (Integer, Double,
Float, Long) posiadają metodę klasową valueOf(string).
Np.
String piStr = "3.14159";
Float pi = Float.valueOf ( piStr );
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 15
Związek klas String, StringBuffer z literałem napisowym
Literały napisowe - np.: "Hello World!"
Każdy napotkany literał napisowy jest automatycznie konwertowany do obiektu
klasy String. Dlatego też literał napisowy może być użyty wszędzie tam gdzie
wymagany jest obiekt klasy String.
Np. jako argument
System.out.println("Pozdrowienia od nowych gości.");
Np. jako niejawnie tworzony obiekt:
int len = "Goodbye".length();
Np. do inicjalizacji obiektu:
String s = "Hola Mundo";
// Bardziej efektywne niż następny wiersz.
String s = new String("Hola Mundo");
// Tu utworzymy dwa obiekty.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 16
Konkatenacja napisów, operator +
Operator
+
umożliwia łączenie napisów, np.:
String cat = "cat";
System.out.println("con" + cat + "enation");
Kompilator korzysta z klasy StringBuffer do implementacji operacji łączenia
napisów.
Np. powyższy fragment "zamieniany jest" niejawnie na:
String cat = "cat";
System.out.println(new StringBuffer().append("con").
append(cat).append("enation").toString());
Operatorem
+
można też łączyć z obiektem klasy String wartości innych typów
niż String, np.:
System.out.println("Liczba " + 1);
// Nastąpi niejawna konwersja liczby
// 1 do obiektu klasy String i operacja konkatenacji.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 17
Przykład 3.6
Wykonanie przypisania
+=
dla obiektów klasy String.
//Program w C++
string* s1 = new string("hello");
string* s2 = s1;
(*s1) += " world";
cout<<*s1<<endl<<*s2<<endl;
return 0;
//s1 = s2 = "hello world"
// Program w Javie
String s1 = "hello";
String s2 = s1;
s1 += " world";
System.out.println(s1 + "\n" + s2);
//s1 = "hello world", s2 = "hello"
W Javie obiekty typu String nie mogą być modyfikowane, więc wykonanie
operacji
+
utworzy nowy obiekt.
Po wykonaniu
+=
powstaje różnica między obiektami s1, s2.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 18
3.3 Klasy dla typów liczbowych
Klasa Number zdefiniowana jest w java.lang . Dalsze klasy liczbowe:
Istnieją też klasy -"opakowania" dla innych typów danych:
Boolean, Character, Void.
Rozszerzone operacje matematyczne zdefiniowane są w klasie Math.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 19
3.4 Tablice
Rozmiar tablicy ustalany jest podczas wykonania programu.
Przykład 3.7.
Deklaracja i utworzenie tablicy:
public class ArrayDemo {
public static void main(String[] args) {
int[] anArray;
// Deklaracja tablicy elementów typu int
anArray = new int[10];
// Utworzenie tablicy 10 elementów int
for (int i = 0; i < anArray.length; i++) {
anArray[i] = i;
System.out.print(anArray[i] + " ");
}
// Przypisz wartośc elementom i wypisz je na wyjście
System.out.println();
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 20
}
Definicja zmiennej referującej tablicę
typ [] nazwaZmiennej
Np.
int[] anArray;
// Deklaracja zmiennej dla tablicy elementów int
// Deklaracja zmiennych dla tablic innych typów
float[] anArrayOfFloats;
boolean[] anArrayOfBooleans;
Object[] anArrayOfObjects;
String[] anArrayOfStrings;
Utworzenie tablicy
new TypElementów[rozmiarTablicy]
Np.
anArray = new int[10];
// Utworzenie tablicy 10 elementów int
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 21
Dostęp do elementu tablicy
Operator indeksowania:
nazwaZmiennej[indeks]
Np.
for (int i = 0; i < anArray.length; i++) {
anArray[i] = i;
System.out.print(anArray[i] + " ");
}
Pobranie rozmiaru tablicy
nazwaTablicy.length
// length jest własnością obiektu.
Inicjalizacja tablicy
Definicja zmiennej referencyjnej z jednoczesną inicjalizacją tablicy:
Np.
boolean[] answers = { true, false, true, true, false };
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 22
Tablica obiektów
- element tablicy może być typu prostego lub typu
klasy.
Przykład 3.8
public class ArrayOfStringsDemo {
public static void main(String[] args) {
String[] anArray = { "One", "Two", "Three" };
for (int i = 0; i < anArray.length; i++) {
System.out.println ( anArray[i].toLowerCase());
}
}
}
Uwaga - w poniższej instrukcji nie zdefiniowano elementów tablicy:
String[] anArray = new String[5];
// Tablica istnieje ale nie jej elementy
for (int i = 0; i < anArray.length; i++) {
// BŁĄD: następna instrukcja spowoduje błąd wykonania
System.out.println(anArray[i].toLowerCase());
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 23
Tablica tablic
Przykład 3.9
public class ArrayOfArraysDemo {
public static void main(String[] args) {
String[][] cartoons = {
// 4 pod-tablice o różnych długościach
{ "Flintstones", "Fred", "Wilma", "Pebbles", "Dino" },
{ "Rubbles", "Barney", "Betty", "Bam Bam" },
{ "Jetsons", "George", "Jane", "Elroy", "Judy", "Rosie", "Astro"},
{ "SD Gang", "Scooby Doo", "Shaggy", "Velma", "Fred", "Daphne" }
};
// Nazwy pod-tablic to: cartoons[0], cartoons[1], itd.
for (int i = 0; i < cartoons.length; i++) {
System.out.print(cartoons[i][0] + ": ");
for (int j = 1; j < cartoons[i].length; j++) {
System.out.print(cartoons[i][j] + " ");
} System.out.println();
}
}
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 24
Przykład 3.10
Utworzenie pod-tablic bez jawnej inicjalizacji:
public class ArrayOfArraysDemo2 {
public static void main(String[] args) {
int[][] aMatrix = new int[4][];
// Pierwszy wymiar (za wyjątkiem
// ostatniego) musi (muszą) być jawnie podany.
for (int i = 0; i < aMatrix.length; i++) {
aMatrix[i] = new int[5];
// Utwórz pod-tablicę
for (int j = 0; j < aMatrix[i].length; j++) { aMatrix[i][j] = i + j; }
}
// Wydrukuj tablicę tablic
for (int i = 0; i < aMatrix.length; i++) {
for (int j = 0; j < aMatrix[i].length; j++) {
System.out.print(aMatrix[i][j] + " ");
} System.out.println();
}
}
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 25
Kopiowanie tablic
- do tego służy metoda
arraycopy
klasy
System
:
public static void arraycopy( Object source, int srcIndex,
Object dest, int destIndex, int length,
Przykład 3.11
public class ArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 26
}
Tablica docelowa musi istnieć i być wystarczająco duża, aby pomieścić
kopiowane dane. Inaczej powstanie błąd.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 27
3.5 Klasa
System
1) Atrybuty programu – klasa
Properties
Ś
rodowisko wykonania zawiera atrybuty systemowe:
•
komputer host, u
ż
ytkownik, bie
żą
ca kartoteka, system operacyjny.
Zarz
ą
dza nimi klasa
System
.
Program w Javie posiada te
ż
konfigurowalne atrybuty programu
(preferencje), np.: opcje startowe, preferowany rozmiar okna.
Atrybut posiada 2 cz
ęś
ci:
nazwa
i
wartość
.
Np. "
os.name
" - nazwa atrybutu systemowego o warto
ś
ci b
ę
d
ą
cej nazw
ą
aktualnego systemu operacyjnego, np. "
Solaris
".
Do ustawiania tych atrybutów słu
żą
3 mechanizmy:
1. własno
ś
ci (trwały zapis atrybutów od wykonania do wykonania),
2. argumenty linii komend (na czas wykonania aplikacji),
3. parametry apletu (na czas wykonania apletu).
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 28
Klasa "
Properties
" dla zarz
ą
dzania atrybutami programu
Klasa
Properties
(w pakiecie
java.util
) umo
ż
liwia zarz
ą
dzanie zbiorem
par
klucz / wartość
.
public class Properties extends Hashtable;
Klasa
System
korzysta z obiektu klasy
Properties
dla zarz
ą
dzania
własno
ś
ciami systemowymi.
Równie
ż
ka
ż
dy program w Javie mo
ż
e korzysta
ć
z obiektu klasy
Properties
dla zarz
ą
dzania swoimi atrybutami programowymi.
Uwaga: dost
ę
p do własno
ś
ci wymaga zgody "security manager-a".
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 29
Czas
ż
ycia własno
ś
ci programu
Start
-
Załadowanie domy
ś
lnych własno
ś
ci do obiektu
Properties
z zewn
ą
trz.
-
Program tworzy drugi obiekt
Properties
i ładuje własno
ś
ci
zapami
ę
tane po poprzednim wykonaniu si
ę
programu.
Program sam si
ę
inicjalizuje na podstawie domy
ś
lnych i pami
ę
tanych
własno
ś
ci.
Wykonywanie
U
ż
ytkownik mo
ż
e zmieni
ć
ustawienia, np. w oknie preferencji, co
poci
ą
ga za sob
ą
modyfikacj
ę
obiektu
Properties
.
Zako
ń
czenie
Program zapisuje swoje własno
ś
ci w dobrze znane sobie miejsce.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 30
Ustawienia obiektów
Properties
// Utwórz i załaduj domyślne własności
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();
// Utwórz własności domyślne programu
Properties applicationProps = new Properties(defaultProps);
// Załaduj własności zapamiętane po poprzednim wykonaniu
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 31
Zapami
ę
tanie własno
ś
ci
Domy
ś
lne własno
ś
ci aplikacji nie zmieniaj
ą
si
ę
, ale inne trzeba zapisa
ć
przed zako
ń
czeniem programu.
FileOutputStream out = new FileOutputStream("appProperties");
applicationProps.store(out, "---No Comment---");
out.close();
Metody klasy
Properties
dla pobrania informacji o własno
ś
ciach:
•
contains (Object value)
•
containsKey (Object key)
- zwracaj
ą
"true
" gdy
value
lub
key
wyst
ę
puj
ą
w
obiekcie
Properties;
przekaza
ć
do nich nale
ż
y obiekty klasy
String.
•
getProperty(String key)
•
getProperty(String key, String default)
- zwraca warto
ść
dla podanej
własno
ś
ci; w drugiej wersji mo
ż
na przekaza
ć
warto
ś
c domy
ś
ln
ą
zwracan
ą
wtedy, gdy własno
ś
ci nie ma.
•
list(PrintStream s)
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 32
•
list(PrintWriter w) -
zapisuje wszystkie własno
ś
ci do strumienia.
•
elements()
•
keys()
•
propertyNames()
- zwraca enumeracj
ę
kluczy lub warto
ś
ci zawartych w
obiekcie
Properties
.
•
size()
- zwraca liczb
ę
par
klucz / wartość
.
Ustawienie własno
ś
ci
Metody klasy
Properties
dla zmiany informacji o własno
ś
ciach:
•
put(Object key, Object value) -
zapisuje par
ę
klucz/wartość
do obiektu
klasy
Properties.
•
remove(Object
key) - usuwa par
ę
klucz/wartość
dla zadanego klucza.
Nale
ż
y przekaza
ć
obiekty klasy
String.
Przykład - program Bingo.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 33
2) Argumenty linii komend
Aplikacja Javy przyjmie dowoln
ą
liczb
ę
argumentów w linii komendy. Np.
tryb "
verbose
" - wy
ś
wietlanie informacji
ś
ledz
ą
cej wykonanie
programu uzyskujemy dzi
ę
ki opcji
-verbose
.
Np. aplikacja o nazwie
Sort
ma sortowa
ć
wiersze w pliku,
przekazywanym w linii komend:
java Sort friends.txt
Argumenty przekazywane s
ą
w postaci tablicy obiektów klasy
String
-
ka
ż
dy
String
jest jednym argumentem linii komend.
W programie mo
ż
na okre
ś
li
ć
liczb
ę
argumentów , np.:
numberOfArgs = args.length;
Nazwa klasy nie jest przekazywana do aplikacji - i tak j
ą
znamy bo
odpowiada klasie o metodzie
main().
Np.
java diff file1 file2
Argumentami s
ą
jedynie
file1
i
file2
.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 34
Przykład.
Echo dla argumentów linii komend:
public class Echo {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++) System.out.println(args[i]);
}
}
Dla komendy:
java Echo Drink Hot Java
wy
ś
wietli si
ę
:
Drink
Hot
Java
Dla komendy z 1-ym argumentem:
java Echo "Drink Hot Java"
wy
ś
wietli si
ę
:
Drink Hot Java
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 35
Zamiana argumentu linii komend na liczb
ę
Je
ś
li przekazano do programu liczb
ę
w linii komend, to nale
ż
y zmieni
ć
obiekt
String
na liczb
ę
.
Np. zamiana na
int
:
int firstArg;
if (args.length > 0)
firstArg = Integer.parseInt(args[0]);
parseInt
zgłasza wyj
ą
tek
NumberFormatException
gdy format
args[0]
jest niewła
ś
ciwy.
Klasy liczbowe -
Integer, Float, Double
, itd. - posiadaj
ą
metody
parseXXX
dla konwersji typu
String
reprezentuj
ą
cego liczb
ę
na obiekt
ich typu.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 36
3) Korzystanie z klasy
System
Klasa
System
umo
ż
liwia dost
ę
p programu do zasobów systemowych
stanowi
ą
c API niezale
ż
ne od konkretnego systemu operacyjnego.
Czasami program mo
ż
e posłu
ż
y
ć
si
ę
obiektem klasy
Runtime
stanowi
ą
cym API zale
ż
ne od systemu operacyjnego.
Wszystkie metody i pola klasy
System
s
ą
klasowe (statyczne) - nie ma
obiektów klasy
System
, do jej składowych odwołujemy si
ę
poprzez klas
ę
.
public final class System extends Object
Klasa jest ostateczna (
final)
a wszystkie jej konstruktory s
ą
prywatne.
Np. odwołania do składowych:
class UserNameTest {
public static void main(String[] args) {
String name;
name = System.getProperty("user.name");
// własność
System.out.println(name);
// obiekt składowy klasy PrintStream
}
}
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 37
Standardowe strumienie wej
ś
cia-wyj
ś
cia
W klasie
java.lang.System
zdefiniowano trzy strumienie tekstowe :
•
standardowy strumie
ń
wej
ś
ciowy
System.in
,
•
standardowy strumie
ń
wyj
ś
ciowy
System.out
i
•
standardowy strumie
ń
bł
ę
dów
System.err .
System.out
i
System.err
dziedzicz
ą
z klasy
PrintStream
, w tym jej trzy
metody dla zapisu tekstu do strumienia:
print, println, write
.
Np. metody
i
println
s
ą
zbli
ż
one do siebie:
System.out.print("Duke is not a penguin!\n"); //
System.out.println("Duke is not a penguin!");
// Równoważne
Metoda
write
słu
ż
y do zapisu bajtów do strumienia.
Argument metod
lub
println
mo
ż
e by
ć
typu:
Object, String, char[], int, long, float, double, boolean.
Istnieje te
ż
bezargumentowa wersja metody
println
, która zapisuje znak
ko
ń
ca linii do strumienia.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 38
Przykład
Zapis ró
ż
nych danych do standardowego strumienia wyj
ś
ciowego.
public class DataTypePrintTest {
public static void main(String[] args) {
Thread objectData = new Thread();
String stringData = "Java Mania";
char[] charArrayData = { 'a', 'b', 'c' };
int integerData = 4;
long longData = Long.MIN_VALUE;
float floatData = Float.MAX_VALUE;
double doubleData = Math.PI;
boolean booleanData = true;
System.out.println(objectData);
System.out.println(stringData);
System.out.println(charArrayData);
System.out.println(integerData);
System.out.println(longData);
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 39
System.out.println(floatData);
System.out.println(doubleData);
System.out.println(booleanData);
}
}
Wynik wykonania programu:
Thread[Thread-4,5,main]
Java Mania
abc
4
-9223372036854775808
3.40282e+38
3.14159
true
Zauwa
ż
my,
ż
e "wydrukowanie" obiektu klasy
Thread
dało napis:
KlasaWątku[Nazwa, priorytet, grupa]
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 40
Własno
ś
ci klasy
System
Klasa System posiada szereg własno
ś
ci (w postaci par klucz/warto
ść
),
które
wyznaczaj
ą
cechy
lub
atrybuty
aktualnego
ś
rodowiska
wykonywania programu, np. aktualny u
ż
ytkownik, wersja
ś
rodowiska.
Lista własno
ś
ci po inicjalizacji systemu czasu wykonania:
Klucz
Znaczenie
"file.separator"
Separator dla pliku (np. "/")
"java.class.path"
Java classpath
"java.class.version"
Wersja klas Javy
"java.home"
Kartoteka instalacji Javy
"java.vendor"
Napis specyficzny dla producenta Javy
"java.vendor.url"
URL producenta Javy
"java.version"
Wersja Javy
"line.separator"
Separator wiersza
"os.arch"
Architektura systemu operacyjnego
"os.name"
Nazwa systemu operacyjnego
"os.version"
Wersja systemu operacyjnego
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 41
"path.separator"
Separator dla
ś
cie
ż
ki (np. ":")
"user.dir"
Katalog bie
żą
cy u
ż
ytkownika
"user.home"
Katalog domowy u
ż
ytkownika
"user.name"
Nazwa konta u
ż
ytkownika
Mo
ż
na odczytywa
ć
i zapisywa
ć
warto
ś
ci własno
ś
ci a tak
ż
e zmienia
ć
zestaw własno
ś
ci systemu.
Uwaga: Aplety nie maj
ą
dost
ę
pu do wszystkich własno
ś
ci systemu.
Aplety nie mog
ą
zapisywa
ć
własno
ś
ci systemu.
Odczyt własno
ś
ci systemu
getProperty
- zwraca napis
getProperties
- zwraca obiekt klasy
Properties
Np.
System.getProperty("path.separator");
Pobiera warto
ść
własno
ś
ci "
path.separator
" w postaci napisu. Gdy
własno
ść
nie istnieje zwraca
null
. W wersji 2-argumentowej w sytuacji
bł
ę
du zwraca warto
ść
2 argumentu.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 42
System.getProperty("subliminal.message", "Błędna własność");
Druga metoda zwraca obiekt klasy
Properties
zawieraj
ą
cy wszystkie
pary klucz/warto
ść
dla własno
ś
ci systemu.
System.getProperties;
Zapis własno
ś
ci systemu
setProperties
- pobiera obiekt klasy
Properties
i zast
ę
puje cały zbiór
własno
ś
ci systemu własno
ś
ciami znajduj
ą
cymi si
ę
w tym obiekcie.
Przykład.
Utworzenie obiektu
p
klasy
Properties
i przekazanie go po
rozszerzeniu o nowe własno
ś
ci jako argument do
setProperties
:
import java.io.FileInputStream;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args) throws Exception {
// Pobierz dane dla nowego obiektu własności z pliku "myProperties.txt"
FileInputStream propFile = new FileInputStream( "myProperties.txt");
Properties p = new Properties(System.getProperties());
// Dodaj wczytane własności do istniejących własności systemu
p.load(propFile);
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 43
// Ustaw na nowo własności systemu
System.setProperties(p);
// Przekaż obiekt jako argument
// Wyświetl nowo ustawion własności
System.getProperties().list(System.out);
}
}
Uwaga: stworzenie pustego obiektu jest mo
ż
liwe, ale poci
ą
gn
ę
łoby za
sob
ą
w tym przykładzie usuni
ę
cie własno
ś
ci systemu:
Properties p = new Properties();
Uwaga: je
ś
li plik
myProperties.txt
zawiera now
ą
warto
ś
c dla istniej
ą
cej
własno
ś
ci systemu, np.
java.vendor
, to zgubimy star
ą
warto
ść
, np.:
java.vendor = Acme Software Company
Zmiana własno
ś
ci systemu ma charakter nietrwały, obowi
ą
zuje tylko do
zako
ń
czenia interpretacji danej aplikacji.
Ś
rodowisko re-inicjalizuje
własno
ś
ci systemu za ka
ż
dym uruchomieniem interpretera.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 44
Wymuszenie finalizacji i "garbage collectora"
Garbage Collector
wykonuje si
ę
cyklicznie, ale na chwil
ę
usuni
ę
cia
obiektów z pami
ę
ci nie mamy wpływu - odbywa si
ę
to w tle. Jest to
niekorzystne, gdy trzeba zwolni
ć
tzw. zarz
ą
dzalne zasoby.
Mo
ż
na wymusi
ć
usuni
ę
cie nieu
ż
ywanych obiektów poprzez:
•
wywołanie metody
gc
w klasie
System
, lub
•
wywołanie metody
runFinalization
w klasie
System
.
Bezpo
ś
rednio przed usuni
ę
ciem obiektu
ś
rodowisko interpretera
wywołuje metod
ę
finalize
zwalnianego obiektu. Mo
ż
na w niej
zdefiniowa
ć
kod "czyszcz
ą
cy" zwi
ą
zany z obiektem.
Mo
ż
na te
ż
wymusi
ć
"finalizacj
ę
" dla wszystkich "nieu
ż
ywanych"
obiektów - wołaj
ą
c metod
ę
runFinalization
:
System.runFinalization();
Wywoła metody
finalize
dla wszystkich "nieu
ż
ywanych" obiektów.
W ka
ż
dej chwili mo
ż
na wywoła
ć
"garbage collector-a":
System.gc();
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 45
Inne metody klasy
System
•
arraycopy
- efektywne kopiowanie zawarto
ś
ci jednej tablicy do drugiej.
•
currentTimeMillis
- podaje upływ czasu wyra
ż
ony milisekundach od
chwili - 00:00:00, w dniu 1 stycznia 1970 r. - do chwili obecnej.
Przykład
Aplet
TimingIsEverything
korzysta z metody
currentTimeMillis
w celu
okre
ś
lenia odst
ę
pu czasu pomi
ę
dzy dwoma klikni
ę
ciami myszy. Je
ś
li ten
odst
ę
p jest mniejszy ni
ż
200 milisekund, to te dwa klikni
ę
cia
interpretowane s
ą
jako jedno podwójne klikni
ę
cie.
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class TimingIsEverything extends java.applet.Applet {
public long firstClickTime = 0;
public String displayStr;
public void init() {
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 46
displayStr = "Double Click Me";
addMouseListener(new MyAdapter());
}
public void paint(Graphics g) {
g.drawRect(0, 0, getSize().width-1, getSize().height-1);
g.drawString(displayStr, 40, 30);
}
class MyAdapter extends MouseAdapter {
public void mouseClicked(MouseEvent evt) {
long clickTime = System.currentTimeMillis();
long clickInterval = clickTime - firstClickTime;
if (clickInterval < 300) {
displayStr = "Double Click!! (Interval = "+ clickInterval + ")";
firstClickTime = 0;
} else {
displayStr = "Single Click!!";
firstClickTime = clickTime;
}
repaint();
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 47
}
}
}
Uwaga: Aktualn
ą
dat
ę
i czas uzyskujemy poprzez klas
ę
java.util.Date
.
•
exit
- metoda ta powoduje zako
ń
czenie pracy interpretera Javy, nie
tylko wykonywania si
ę
naszego programu - jako argument podajemy
kod przekazywany przez interpreter na zako
ń
czenie, np.:
System.exit(-1);
Uwaga:
takie wywołanie z wewn
ą
trz apletu zwykle spowoduje wyj
ą
tek
SecurityException
.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 48
3.6 Własny "
Security Manager
"
"
Security manager
" jest to obiekt aplikacji, który zezwala na wykonanie
si
ę
potencjalnie niebezpiecznych operacji. Klasy biblioteczne pytaj
ą
go o
pozwolenie na wykonanie okre
ś
lonych operacji.
Klasa
System
umo
ż
liwia nam dost
ę
p do i zmian
ę
tego obiektu.
Definiuj
ą
c klasy pochodne od klasy
java.lang.SecurityManager
mo
ż
emy
stosowa
ć
ró
ż
ne polityki bezpiecze
ń
stwa.
Uwaga: "
Security manager
" mo
ż
e by
ć
tylko raz ustalony dla jednej
aplikacji. Próba ponownego ustawienia go spowoduje wyj
ą
tek
SecurityException.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 49
Wprowadzenie
Klasa
SecurityManager
wyst
ę
puje w pakiecie
java.lang
i jest klas
ą
abstrakcyjn
ą
.
Aplikacja nie posiada
ż
adnego domy
ś
lnego "security manager-a", musi
go utworzy
ć
i zainstalowa
ć
.
Mo
ż
na pobra
ć
aktualnego "security manager-a" dla aplikacji metod
ą
getSecurityManager()
, np.:
SecurityManager appsm = System.getSecurityManager();
Je
ś
li nie ma "security manager-a" to metoda zwraca
null
.
Maj
ą
c dost
ę
p do "security manager-a" mo
ż
emy "zapyta
ć
" o pozwolenie
wykonania operacji.
Np. metoda
System.exit()
ko
ń
czy wykonywanie interpretera Javy, ale
przedtem pyta "security manager-a" poprzez jego metod
ę
checkExit()
o
pozwolenie na operacj
ę
zako
ń
czenia:
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 50
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkExit(status);
}
// Kontynuacja, gdy metoda checkExit() zakończy się normalnie.
Pozytywna odpowied
ź
jest równowa
ż
na normalnemu zako
ń
czeniu
metody checkExit()
. Gdy "security manager" "nie zgadza si
ę
" na
wykonanie operacji wtedy metoda
checkExit()
zgłasza wyj
ą
tek
SecurityException
.
Inne metody klasy
SecurityManager
:
•
checkAccess()
- sprawdza dost
ę
p dla w
ą
tków,
•
checkPropertyAccess()
- sprawdza dost
ę
p do zadanej własno
ś
ci
•
dalsze metody typu
checkXXX()
- gdzie
XXX
oznacza operacj
ę
.
Metody te s
ą
ju
ż
wykorzystywane przez klasy pakietów Javy i program
u
ż
ytkownika zwykle nie musi ich wywoływa
ć
.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 51
Napisanie "Security Manager-a"
Nale
ż
y utworzy
ć
klas
ę
pochodn
ą
od
SecurityManage
i nadpisa
ć
metody,
które maj
ą
by
ć
inaczej wykonywane ni
ż
dziedziczone.
Przykład
Nasza klasa
PasswordSecurityManager
wprowadza restrykcyjny dost
ę
p do
plików zewn
ę
trznych, co wymaga nadpisania metod
checkRead() i
checkWrite() .
class PasswordSecurityManager extends SecurityManager {
. . .
}
W naszej klasie
PasswordSecurityManager
zadeklarujemy prywatne pole
password
zawieraj
ą
ce hasło, które u
ż
ytkownik musi poda
ć
dla uzyskania
dost
ę
pu do pliku. Hasło ustawiane jest w konstruktorze:
PasswordSecurityManager(String password) {
super();
this.password = password;
}
Prywatna metoda
accessOK()
komunikuje si
ę
z u
ż
ytkownikiem, uzyskuje
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 52
od niego hasło i sprawdza jego poprawno
ść
:
private boolean accessOK() {
int c;
DataInputStream dis = new DataInputStream(System.in);
String response;
System.out.println("Podaj hasło!");
try {
response = dis.readLine();
if (response.equals(password))
return true;
else
return false;
} catch (IOException e) {
return false;
}
}
W klasie
PasswordSecurityManager
nadpisano 3 metody
checkRead()
i 2
metody
checkWrite()
:
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 53
public void checkRead(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
if (!accessOK())
throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
if (!accessOK())
throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
if (!accessOK())
throw new SecurityException("Not Even!");
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 54
}
Wszystkie powy
ż
sze metody wywołuj
ą
prywatn
ą
metod
ę
accessOK().
Uwaga: domy
ś
lne definicje metod
checkXXX() w klasie SecurityManager
zgłaszaj
ą
zawsze wyj
ą
tek
SecurityException
.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 55
Instalowanie własnego "Security Manager-a"
Wykorzystuje si
ę
do tego celu metod
ę
setSecurityManager()
w klasie
System
.
Przykład
Nasza aplikacja
SecurityManagerTest
instaluje
PasswordSecurityManager
(klasa z poprzedniego przykładu) jako aktualnego "security manager-a".
Nast
ę
pnie, dla sprawdzenie jego istnienia i poprawnej pracy, aplikacja
otwiera dwa pliki i przepisuje zawarto
ś
c jednego z nich do drugiego.
Metoda
main()
klasy
SecurityManagerTest
:
// Instaluj "security manager-a"
try {
System.setSecurityManager ( new PasswordSecurityManager ("Hip Hop"));
} catch (SecurityException se) {
System.out.println("Istnieje już zanistalowany SecurityManager!");
}
W dalszej cz
ęś
ci - kopiowanie pliku
inputtext.txt
do pliku
outputtext.txt
:
try {
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 56
DataInputStream fis = new DataInputStream(
new FileInputStream("inputtext.txt"));
DataOutputStream fos = new DataOutputStream(
new FileOutputStream("outputtext.txt"));
String inputString;
while ((inputString = fis.readLine()) != null) {
fos.writeBytes(inputString);
fos.writeByte('\n');
}
fis.close();
fos.close();
} catch (IOException ioe) {
System.err.println("I/O failed for SecurityManagerTest.");
}
Przykład wyniku wykonania aplikacji
SecurityManagerTest :
Podaj hasło!
Hip Hop
Podaj hasło!
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 57
Złe hasło
java.lang.SecurityException: Not Even!
at
PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46)
at java.io.FileOutputStream.(FileOutputStream.java)
at SecurityManagerTest.main(SecurityManagerTest.java:15)
Domy
ś
lne implementacje metod w klasie
SecurityManager
:
public void checkXXX(. . .) {
throw new SecurityException();
}
Czyli nie zezwalaj
ą
one na
ż
adn
ą
operacj
ę
!
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 58
Jakie metody klasy
SecurityManager
nale
ż
y nadpisa
ć
?
Pierwsza kolumna to obiekty, na których wykonywane s
ą
operacje. Druga
kolumna to metody klasy
SecurityManager
, które słu
żą
do sprawdzania
operacji na tych obiektach.
Operacje na obiekcie Sprawdzane przez metod
ę
gniazdka
checkAccept(String host, int port)
checkConnect(String host, int port)
checkConnect (String host, int port,
Object executionContext)
checkListen(int port)
wątki
checkAccess(Thread thread)
checkAccess(ThreadGroup threadgroup)
class loader
checkCreateClassLoader()
system plików
checkDelete(String filename)
checkLink(String library)
checkRead(FileDescriptor filedescriptor)
checkRead(String filename)
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 59
checkRead(String filename,
Object executionContext)
checkWrite(FileDescriptor filedescriptor)
checkWrite(String filename)
rozkazy systemu
checkExec(String command)
interpreter
checkExit(int status)
pakiet
checkPackageAccess(String packageName)
checkPackageDefinition(String packageName)
własności
checkPropertiesAccess()
checkPropertyAccess(String key)
checkPropertyAccess(String key, String def)
sieć
checkSetFactory()
okna
checkTopLevelWindow(Object window
)
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 60
3.7 Obiekt klasy
Runtime
Wi
ę
kszo
ść
potrzeb aplikacji dost
ę
pu do systemu obsługuje klasa
System
.
W rzadkich przypadkach aplikacja mo
ż
e odwoła
ć
si
ę
bezpo
ś
rednio do
ś
rodowiska czasu wykonania.
public class Runtime extends Object
Ka
ż
da aplikacja w Javie posiada jeden (niejawnie utworzony) obiekt
klasy
Runtime
, stanowi
ą
cy sprz
ę
g aplikacji ze
ś
rodowiskiem wykonania.
Obiektu tej klasy nie mo
ż
na jawnie utworzy
ć
w programie.
3. Klasy w java.lang
W. Kasprzak: Programowanie zdarzeniowe
3 - 61
Dost
ę
p do obiektu uzyskujemy poprzez metod
ę
getRuntime
:
public static Runtime getRuntime() ;
// Zwraca aktualny obiekt Runtime
Obiekt
Runtime
dostarcza dwóch usług:
•
komunikacja z komponentami
ś
rodowiska czasu wykonania -
pobieranie danych i wywoływanie funkcji.
•
zapewnienie sprz
ę
gu z funkcjami zale
ż
nymi od systemu, np. z
funkcjami
getenv
i
setenv
w systemie
UNIX
.