Proz S3 id 402993 Nieznany

background image

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

ń

.

background image

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 .

background image

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.

background image

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

background image

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'

background image

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.

background image

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 );

background image

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.

background image

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.

background image

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

background image

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());
}

background image

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 ż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();
}
}
}

background image

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.

background image

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".

background image

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();
. . .

background image

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.

background image

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

background image

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

}
}

background image

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

ń

ę

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

print

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

print

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);

background image

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

background image

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

ę

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);

background image

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();

background image

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();

background image

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

ć

ż

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.

background image

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

ć

.

background image

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()

:

background image

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

.

background image

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!

background image

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)

background image

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.

background image

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

.


Wyszukiwarka

Podobne podstrony:
Proz S2 id 402992 Nieznany
Proz S12 id 402989 Nieznany
Proz S9 id 402999 Nieznany
Proz S8 id 402998 Nieznany
Proz S13 id 402990 Nieznany
Proz S4 id 402994 Nieznany
Proz S14 id 402991 Nieznany
Proz S7 id 402997 Nieznany
Proz S10 id 402987 Nieznany
Proz S5 id 402995 Nieznany
Proz S2 id 402992 Nieznany
Proz S12 id 402989 Nieznany
chemia proz maj 2011 cke id 112 Nieznany
Abolicja podatkowa id 50334 Nieznany (2)
4 LIDER MENEDZER id 37733 Nieznany (2)
katechezy MB id 233498 Nieznany
metro sciaga id 296943 Nieznany
perf id 354744 Nieznany
interbase id 92028 Nieznany

więcej podobnych podstron