programowanie dla platformy jav 4pr id 826455

background image

Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj

Strona główna :: Java

Edytuj

Historia

Podstawy Javy

Spis treści

1 Podstawowe pojęcia programowania obiektowego i Javy

1.1 Klasa

1.2 Obiekt

1.3 Zmienna

1.4 Stała

1.5 Metoda

1.6 Konstruktor

1.7 Pole

1.8 Interfejs

1.9 Modyfikatory dostępu

1.9.1 Modyfikator publiczny

1.9.2 Modyfikator prywatny

1.9.3

1.9.4 Modyfikator domyślny

1.10 Inne modyfikatory

1.10.1 Modyfikator final

1.10.2 Modyfikator static

1.10.3 Modyfikator strictfp

1.10.4 Modyfikator native

1.10.5 Modyfikator transisten

1.10.6 Modyfikator volatile

2 Typy Proste i Obiekty

3 Operatory

3.1 Operatory matematyczne

3.2 Operatory logiczne

3.3 Operatory bitowe

4 Instrukcje sterujące

4.1 Instrukcja if / if else

4.2 Operator trójargumentowy ? :

4.3 Blok switch

5 Pętle

5.1 Pętla for

5.2 Pętle while i do while

5.3 Pętla for element : Iterable

5.4 Przerywanie i przechodzenie do następnego kroku w pętlach

5.4.1 break

5.4.2 continue

5.5 Podsumowanie pętli

6 Tablice i Kontenery

6.1 Tablice

6.2 Kontenery

6.2.1 Listy

6.2.2 Mapy

6.2.3 Set

6.2.4 Kolejka

6.3 Podsumowanie

Podstawowe pojęcia programowania obiektowego i Javy

Język Java jest Zorientowany Obiektowo, czyli posługuje się pojęciami takimi jak Obiekt, czy Klasa. Poniżej
przedstawiamy listę podstawowych pojęć związanych z programowaniem obiektowym. Nie są to ścisłe definicje
jakie można znaleźć w książkach. Ich zadaniem jest opisanie w przystępny sposób pojęć związanych z OOP.

Klasa

Abstrakcyjny byt określający zbiór Obiektów o takich samych właściwościach.

Klasa definiuje zestaw Metod i Pól dla swoich Obiektów. Przykładem klasy może być samochód. Może on
podejmować różne działania np. jechać i ma pewne właściwości np. kolor. Jest jednak abstrakcyjny, mówiąc
inaczej "nienamacalny". Jeżeli mówimy o klasie Samochód to oznacza, że mówimy o jakimś samochodzie.

Ogólny wzór definicji klasy w Javie wygląda w następujący sposób:

[

modyfikator dostępu

]

[

abstract

]

class NazwaKlasy

{

Delphi

Artykuły
Kompendium
Gotowce
FAQ
.NET

Turbo Pascal

FAQ

PHP

FAQ

Java

FAQ

C/C++

Artykuły
FAQ

C#

Wprowadzenie

Assembler

FAQ

(X)HTML
CSS
JavaScript
Z pogranicza
Recenzje
Algorytmy

W IĘCEJ

»

Delphi
C/C++
Turbo Pascal
Assembler
PHP

Programy
Dokumentacja
Kursy
Komponenty

W IĘCEJ

»

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

1 z 12

2010-02-11 13:21

background image

// definicja pól i metod

}

Nasz wzorcowy samochód:

public

class Samochod

{

public

Color

kolor = new

Color

(

255

,

255

,

255

)

; // pole kolor określa kolor samochodu

public

void

jedzie

(){

//kod odpowiedzialny za jazdę samochodu

}

}

Klasa może implementować Interfejs. Oznacza to, że klasa ma wszystkie metody, zachowania, definiowane
przez interfejs. Klasa musi implementować wszystkie metody interfejsu. Tu jednak rodzi się pytanie co zrobić
jeżeli nie chcemy implementować wszystkich metod? Można oczywiście zaimplementować je w taki sposób by
zwracały wartości null. Jednak nie jest to dobre rozwiązanie. Można powiedzieć nawet więcej, jest to najgorsze
z możliwych rozwiązań, ponieważ ukrywa fakt braku implementacji metod. Znacznie lepszym rozwiązaniem
jest uczynienie danej klasy abstrakcyjną.
Klasa abstrakcyjna zawiera w sobie zwykłe metody, czyli takie które mają jawną implementację, oraz metody
abstrakcyjne. Metoda abstrakcyjna nie ma implementacji. Poniżej przykład klasy abstrakcyjnej:

public

abstract class KlasaAbstrakcyjna

{

public

int

pole;

public abstract

void

metodaAbstrakcyjna

()

;

public

void

metodaZwykła

(){

//Kod metody

}

}

Po co to wszystko? Dochodzimy do bardzo ważnego elementu programowania obiektowego jakim jest
dziedziczenie. Załóżmy, że chcemy stworzyć klika klas odpowiadających różnym markom i typom
samochodów. Interesuje nas to że samochody jeżdżą i mogą mieć doczepioną naczepę. Najbardziej
prawidłowe podejście powinno wyglądać w następujący sposób:

Definiujemy interfejs Samochód. Posiada on metody które odpowiadają działaniom wszystkich
samochodów np.

jedź
załóż naczepę

Tworzymy klasę abstrakcyjną, która implementuje interfejs Samochód w taki sposób, że metoda jedź
jest wspólna dla wszystkich samochodów, a metoda załóż naczepę abstrakcyjna.
Tworzymy poszczególne klasy samochodów. Dziedziczą, rozszerzają, one klasę AbstrakcyjnySamochód i
implementują zakładanie naczepy w zależności od potrzeb.

Nasze samochody to:
Ferrari
Star
Kod takiego programu powinien wyglądać mniej więcej w taki sposób:

// plik Samochód
public

interface Samochód

{

public

void

jedź

()

;

public

void

załóżNaczepę

()

;

}

//plik AbstrakcyjnySamochód
public

abstract class AbstrakcyjnySamochód implements Samochód

{

public

void

jedź

()

{

//kod odpowiedzialny za poruszanie się samochodu

}

public abstract

void

załóżNaczepę

()

;

}

//plik Ferrari
public

class Ferrari extends AbstrakcyjnySamochód

{

public

void

załóżNaczepę

()

{

//nic nie robim. Ferrari nie może mieć naczepy

}

}

//plik Star
public

class Star extends AbstrakcyjnySamochód

{

public

void

załóżNaczepę

()

{

//Czynności związane z zakładaniem naczepy

}

}

Kilka uwag o dziedziczeniu i interfejsach w javie:

Można dziedziczyć tylko po jednej klasie
Klasa może implementować kilka interfejsów, ale trzeba uważać na konflikty nazw
Interfejs może dziedziczyć po innym interfejsie
Wszystkie obiekty dziedziczą po klasie Object

Obiekt

Byt fizyczny stanowiący instancję klasy

Obiekt jest fizyczną "manifestacją" Klasy. Oznacza to że ma własne miejsce w pamięci komputera i możemy
nim manipulować. Jeżeli mówimy o obiekcie samochód będącym instancją Klasy Samochód to oznacza, że
mówimy o konkretnym samochodzie.

Obiekt definiujemy jako Zmienną.

Zmienna

Byt fizyczny o którym mówimy że ma wartość

RSS | Forum | Pastebin |

Regulamin | Pomoc | Usuń

cookies | Prawa autorskie |

Kontakt | Reklama

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3

Czas generowania strony: 0.6173 sek. (zapytań SQL:

11)

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

2 z 12

2010-02-11 13:21

background image

Przez pojęcie zmiennej w Javie rozumiemy referencję, wskazanie, do określonego miejsca w pamięci
komputera. Zmienne reprezentują dane i pozwalają za swoim pośrednictwem nimi manipulować.

Stała

Rodzaj zmiennej, której wartość nie podlega modyfikacji

Stała to zmienna, która po nadaniu jej wartości nie może być już zmieniona. Zazwyczaj tej konstrukcji używa
się do definiowania np. ustawień. Chcąc uzyskać taki efekt należy użyć słowa kluczowego final

Metoda

Działanie, które mogą podjąć Obiekty danej Klasy

Metoda określa Działanie. Dlatego najczęściej stosuje się do jej nazwania czasowniki. samochód.jedzie() -
jedzie() to metoda, działanie. Metody wywołujemy za pomocą znaku . po nazwie zmiennej.

Konstruktor

Konstruktor to specyficzna metoda wywoływana by stworzyć Obiekt

Konstruktor jest wywoływany za każdym razem gdy tworzony jest nowy obiekt. Można go traktować jako
specyficzną metodę, która zwraca nową instancję klasy, ale nie ma tego wpisanego w sygnaturze (jest to
jednak bardzo uproszczone podejście). Konstruktor może przyjmować parametry. Konstruktor bezparametrowy
nazywany jest czasami konstruktorem domyślnym ponieważ, jeżeli nie zdefiniowano w klasie żadnego
konstruktora to kompilator umieści w niej konstruktor bezparametrowy. Jeżeli zdefiniujemy w klasie choć jeden
konstruktor z parametrami to kompilator nie wygeneruje konstruktora domyślnego. Musimy go sami
zdefiniować.

Pole

Właściwość Obiektu danej Klasy

Samochód może mieć kolor. Pole Klasy rozumiemy właściwość lub relację MA. Pole jest zmienną która należy do
klasy.

Interfejs

Dobrze zdefiniowany zestaw czynności - metod, które może wykonać obiekt danej klasy

Interfejs jest jednym z najtrudniejszych do zrozumienia pojęć OOP. Jednocześnie jest stosunkowo prostym
pojęciem jeżeli posłużymy się przykładem. Załóżmy że Samochód Jest Interfejsem. Oznacza to że możemy
korzystać z jego Metod i Stałych. Jednocześnie możemy zdefiniować kilka różnych klas implementujących
interfejs Samochód. Wszystkie one będą miały dobrze zdefiniowane metody interfejsu. Oznacza to że jeżeli
wiemy że dany obiekt implementuje interfejs samochód to możemy "w ciemno" używać metod tego interfejsu.
Nie interesuje nas jak one działają, a jedynie ich parametry wywołania i to co otrzymamy w wyniku ich
działania.
W życiu codziennym spotykamy się z interfejsami które zapewniają funkcjonalności, a jednocześnie nie musimy
znać zasad ich działania. Przykład to pilot od telewizora. Jest interfejsem pozwalającym na włączania, zmianę
kanałów i wyłączanie urządzenia.
W języku Java definicja jest następująca:

[

modyfikator dostępu

]

interface NazwaInterfejsu

{

// definicja stałych i metod

}

W naszym przykładzie z samochodem:

public

interface Samochod

{

public final

Color

kolor = new

Color

(

0

,

0

,

0

)

; // pole będące stałą. Produkujemy Fordy T ;)

public

void

jedzie

()

;

}

Modyfikatory dostępu

Od początku zarówno w definicji klasy jak i interfejsu, metody i pola znajduje się tajemniczy zapis [modyfikator
dostępu].

Modyfikator dostępu określa w jaki sposób inne obiekty mogą otrzymać dostęp do danego
pola, metody, definicji klasy czy interfejsu. W języku Java wyróżniamy cztery modyfikatory
dostępu: publiczny, prywatny, chroniony i domyślny.

Modyfikator publiczny

Określany jest słowem kluczowym public. Oznacza iż do danej metody, pola, definicji klasy i interfejsu ma
dostęp każdy obiekt w uniwersum javy (JU). Dostęp ten nie jest uzależniony o tego w jakim pakiecie znajduje
się udostępniana własność i czy to jest ten sam pakiet co pakiet obiektu z którego pochodzi żądanie.

Modyfikator prywatny

Jest przeciwieństwem modyfikatora publicznego. Pola, metody, klasy i interfejsy oznaczone słowem private są

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

3 z 12

2010-02-11 13:21

background image

całkowicie niewidoczne poza definicją swojego właściciela. Przykładowa klasa zawierająca zarówno pola,
metody, klasy i interfejsy prywatne:

class

PrywatnaKlasa

{

private

int

polePrywatne;


private

void

metodaPrywatna

(){}


private interface prywatnyInterfejs

{}


private class prywatnaKlasa implements prywatnyInterfejs

{}

}

Żaden obiekt w JU nie będzie wstanie odwołać się do zawartości PrywatnaKlasa. Bardzo istotnym faktem jest
to, że klasa znajdująca się na najwyższym poziomie, czyli PrywatnaKlasa nie może być prywatna.

Modyfikator chroniony

Modyfikator chroniony oznaczamy słowem kluczowym protected. Elementy oznaczone w ten sposób są
widoczne tylko dla innych obiektów znajdujących się poniżej w tej samej hierarchii klas. Innymi słowy
dziedziczące po klasie zawierającej elementy chronione. Oczywiście są też widoczne dla innych elemntów
znajdujacych się w tym samym pakiecie i pod pakietach.

Modyfikator domyślny

Nie jest oznaczony żadnym słowem kluczowym. Nie zrozumienie jak działa modyfikator domyślny jest źródłem
popularnych błędów związanych z próbą wykorzystania oznaczonych w ten sposób pól i metod. Modyfikator
domyślny można zdefiniować w następujący sposób, jeżeli dostęp do pola, metody, klasy lub intrerfejsu jest
oznaczony jako domyślny to mogą go otrzymać tylko te obiekty, które znajduja się w tym samym pakiecie.
Oznacza to, że klasy dziedziczące po klasie zawierającej elementy z dostępem domyślnym nie będą mogły użyć
tego elementu chyba, że znajdują się w tym samym pakiecie. Ten sam pakiet oznacza literalnie ten sam
katalog w strukturze pakietów. Nie może to być np. podkatalog o innej strukturze pakietów nie wspominając.

Inne modyfikatory

Poza modyfikatorami dostępu funkcje i pola obiektów mogą być opisane za pomocą innych modyfikatorów.

Modyfikator final

Pole obiektu oznaczone jako final po inicjacji nie może być modyfikowane. Oznacza to, że inicjacji pola można
dokonać tylko na dwa sposoby. Poprzez jawne inicjowanie w definicji klasy:

class

Klasa

{

final

Object

pole = new

Object

()

;

}

lub w konstruktorze:

class

Klasa

{

final

Object

pole;

public Klasa

(){

pole = new

Object

()

;

}

public Klasa

(

Object

obj

){

pole = obj;

}

}

Wartość pola po zainicjowaniu nie może być już zmieniana. Jeżeli pole wskazuje na jakiś obiekt to dalej można
używać metod ustawiających tego obiektu i bezpośrednich odwołań do pól do ustawiania wartości pól tego
obiektu.

W przypadku metody oznaczenie jej jako final powoduje, że klasy dziedziczące po klasie nie mogą przesłonić
metody:

public

class KlasaA

{

final

void

metoda

(){}

}

class

KlasaB extends KlasaA

{

// Niedozwolone! Nie można przesłonić metody final
//void metoda(){}

}

Jeżeli klasa jest oznaczona jako final to nie można rozszerzyć tej klasy:

public

final class KlasaA

{

}

// nie można rozszerzyć klasy oznaczonej jako final
//class KlasaB extends KlasaA{}

Modyfikator static

Modyfikator static oznacza iż pole obiektu ma taką samą wartość dla wszystkich obiektów danej klasy.
Formalnie oznacza to iż wszystkie obiekty danej klasy odwołują się do tego samego miejsca w pamięci.

Jeżeli metoda jest oznaczona jako statyczna to może być wywołana bez potrzeby tworzenia obiektu klasy
definiującej tą metodę. W tym miejscu należy wspomnieć iż do zarówno metod, jak i pól oznaczonych jako
static dobieramy się w inny sposób iż do normalnych metod i pól. Chcąc odwołać się do statycznego elementu
należy użyć wzorca:

<<nazwa_klasy>>.<<nazwa_metody/nazwa_pola>>

Jeżeli chcemy użyć tradycyjnego odwołania:

obiekt.

metoda

()

;

obiekt.

pole

;

to kompilator zwróci ostrzeżenie The static field/method obiekt.pole/obiekt.metoda() should be accessed in a

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

4 z 12

2010-02-11 13:21

background image

static way.

Program powinien kompilować się bez błędów i ostrzeżeń.

Modyfikator strictfp

Metoda lub klasa oznaczona w ten sposób będzie wykonywana tak by wszystkie obliczenia były zgodne ze
standardem IEEE-754.

Modyfikator native

Zaawansowany modyfikator, którym oznaczane są metody wykonywane przez JNI (Java Native Interface). W
praktyce oznacza to, że metody te są implementowane w języku innym niż Java, a JVM wywołując je odwołuje
się do mechanizmów pozwalających na komunikację z np C++.

Modyfikator transisten

Zaawansowany modyfikator związany z JPA (Java Persistence Api). Pola oznaczone w ten sposób nie są
utrwalane.

Modyfikator volatile

Zaawansowany modyfikator związany z wielowątkowością. Zmienna nim oznaczona może być modyfikowana
przez wiele wątków jednocześnie.

Typy Proste i Obiekty

Typy danych obecne w Javie dzielą się na typy proste:

Nazwa

typu

Liczba

bajtów

Dopuszczalne wartości

Znaczenie

Przykłady

literałów

byte

1

-128/+127

l. całkowita

1, 01, 0x01

short

2

-32768/+32767

l. całkowita

128, 0xFF

int

4

-2147483648/+2147483647

l. całkowita

32768, 0x1000

long

8

-9223372036854775808/+9223372036854775807

l. całkowita

3l(L), 21474836

float

4

-3.xE-38/(+3.xE+38)-1

l. rzeczywiste 3f, 3F, 3e(E)+10

double

8

-1.xE-30/(+1.xE+30) -1

l. rzeczywiste

0.3, 0.3d(D) ...

char

2

0...65556

znaki Unicodu

'a', \\u0013

boolean

1

true/false

wartości
logiczne

true, false

Wszystkie inne dane w Javie traktowane są jako obiekty. Warto zaznaczyć, że od wersji 1.5 Java oferuje
mechanizm "pudełkowania" (autoboxing) dla typów prostych. Zasada działania tego mechanizmu jest
teoretycznie dość prosta. Wszelkie typy proste są w procesie kompilacji zamieniane na odpowiadające im
obiekty. Mechanizm zamieniający kompilatora dba jednak o to, żeby skompilowany kod zachował zgodność
wstecz. Obiekty odpowiadające typom prostym mogą zostać "wypakowane" (unboxing) do typu prostego.

przykłady deklaracji zmiennych:

int

a; //deklaracja zmiennej a typu całkowitego

char b; //deklaracja zmiennej b, która zawiera znaki Unicode

Równoczesna deklaracja i inicjacja zmiennych:

int

a =

3

;

char b =

'c'

;

Oprócz typów prostych w Javie istnieją typy obiektowe. Są to np:
Button, Panel, Label, Okno - nazwa klasy stworzonej przez użytkownika

Deklaracja zmiennych typu obiektowego:

Button

b = new

Button

()

;

Typy proste jak i obiekty mogą zostać najpierw zdefiniowane, a zainicjowane dopiero później. Zmienne które są
polami obiektów zawsze są inicjowane z wartością domyślną. Zmienne lokalne (zwane też automatycznymi)
muszą zostać jawnie zainicjowane. Przykład:

class

Foo

{

int

zmienna; //zmienna będzie miała domyślna wartość - 0 - w momencie stworzenia obiektu

klasy

Object

obj; //zmienna będzie miała domyślna wartość - null - w momencie stworzenia obiektu

klasy
pubic

void

bar

(){

/* zmienna musi zostać jawnie zainicjowania,
* inaczej kompilator zwróci błąd variable may not been initialized
* jeżeli będziemy chcieli jej użyć
*/

int

zmienna2;

zmienna2 =

1

;

System

.

out

.

println

(

zmienna

)

; // 0

System

.

out

.

println

(

zmienna2

)

; // 1

}

}

Od wersji 1.5 wprowadzono nowy typ enum. Jest to rozwiązanie problemów pojawiających się gdy stosujemy
konstrukcje podobne do poniższej:

class

Kasa

{

public

static

final

String

ADD=

"dodaj"

;

public

static

final

String

LIST=

"Wypisz"

;

public

static

final

String

DELETE=

"Usuń"

;

//....

}

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

5 z 12

2010-02-11 13:21

background image

// później w kodzie:

class

A

{

public

void

metoda

(

String

akcja

){

if

(

akcja.

equals

(

Klasa.

ADD

)){

//....

}

else

if

(

akcja.

equals

(

Klasa.

LIST

)){

//....

}

else

if

(

akcja.

equals

(

Klasa.

DELETE

)){

//....

}

else

{

//....

}

}

}

Takie rozwiązanie ma wiele wad. Do najprostszych należą

możliwość użycia złej nazwy, słaba typowalność nazw
skrajna nierozszerzalność użycie słowa kluczowego

final

wyklucza zmianę klucza. przypadkowa próba

nadpisania klucza powoduje błędy kompilacji.

Zamiast takiego podejścia należy używać typu

enum

:

enum Akcje

{

ADD,
LIST,
DELETE;

}

Ze względu na złożoność zagadnienia bardzo szczegółowy opis znajduje się w oddzielnym

artykule

Operatory

W javie istnieje kilka operatorów. Możemy je podzielić na trzy główne grupy. Pierwszą stanowią operatory
matematyczne. Drugą operatory logiczne, w tym operatory porównania, a trzecią operatory bitowe.

Operatory matematyczne

Operator

Znaczenie

+

Dodawanie

-

Odejmowanie

*

Mnożenie

/

Dzielenie

%

Reszta z dzielenia

\

Wynik dzielenia z resztą

Dodatkowo zdefiniowane są jeszcze dwa operatory inkrementacji i dekrementacji:

Operator

Znaczenie

++

Inkrementacja - zwiększenie o 1

--

Dekrementacja - zmniejszenie o 1

Isntnieją też operatory mające sens "wykonaj działanie i przypisz". Za przykład niech posłuży nam operator
dodawania:

int

a =

1

;

a +=

1

; // a ma wartość 2

Operatory logiczne

Komputer jest maszyną "myślącą" w sposób całkowicie logiczny. Na podstawowym poziomie komputer
wykonuje najprostsze operacje logiczne. Zasada te ma odwzorowanie w operatorach logicznych oraz w
operatorach porównania.

Operator

Znaczenie

||

Operacja ∨ - LUB

&&

Operacja ∧ - I

!

Operacja ~ - negacja

>

większy niż

<

mniejszy niż

>=

większy równy

<=

mniejszy równy

!=

różny od

Jak widać w powyższej tabeli zabrakło ważnego operatora. Operator równy w języku Java sprawia osobą
początkującym wiele problemów. Wynika to ze specyfiki języka. Zapis:

a == b;

ma różne znaczenie w zależności od tego czy odnosi się do typów prostych czy też obiektów. Jeżeli
porównujemy w ten sposób dwie zmienne typu prostego to operator działa "intuicyjnie". Przykład:

int

a =

1

;

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

6 z 12

2010-02-11 13:21

background image

int

b =

1

;

System

.

out

.

println

(

a == b

)

; // zwróci true

W odniesieniu do zmiennych obiektowych zasada ta jest inna. Operator == oznacza Identyczność, a nie
równość:

Integer

a = new

Integer

(

1

)

;

Integer

b = new

Integer

(

1

)

;

Integer

c = a; // c jest referencją do tego samego obiektu na stercie co a

System

.

out

.

println

(

a == b

)

; // zwróci flase, a i b to różne obiekty tej samej klasy

System

.

out

.

println

(

a == c

)

; // zwróci true, a i c to ten sam obiekt

Jeżeli chcemy porównać dwa obiekty należy użyć metody equals():

Integer

a = new

Integer

(

1

)

;

Integer

b = new

Integer

(

1

)

;

System

.

out

.

println

(

a.

equals

(

b

))

; // zwróci true

Ostatnim operatorem porównania dla obiektów jest słowo kluczowe instanceof. Przykład:

Integer

a = new

Integer

(

1

)

; // dziedziczy po Number, a ta po Object

System

.

out

.

println

(

a instanceof

Integer

)

; // zwróci true a jest klasy Integer

System

.

out

.

println

(

a instanceof

Object

)

; // zwróci true, klasa Integer dziedziczy po Object, a

jest klasy Object

System

.

out

.

println

(

a instanceof

Serializable

)

; // zwróci true, klasa Number implementuje

Serializable, a jest Serializable

90% błędów popełnianych przez początkujących programistów związanych z warunkami logicznymi związane
jest z niezrozumieniem i pomyleniem operatora == i metody equals();

Operatory bitowe

Komputery pracują na bitach. Operacje na nich w wielu przypadkach pozwalają na znaczne przyspieszenie
obliczeń.

Operator

Znaczenie

|

Operacja LUB

$

Operacja I

~

Operacja negacji

^

Operacja różnicy symetrycznej XOR

>>

Operacja przesunięcia w prawo

<<

Operacja przesunięcia w lewo

>>>

Operacja przesunięcia w prawo z wypełnieniem zerami

Instrukcje sterujące

W momencie gdy chcemy, aby program dokonał wyboru jednej z dróg na podstawie prawdziwości jakiegoś
warunku logicznego możemy użyć jednej z dwóch instrukcji sterujących. Jeżeli chcemy, aby wybór został
dokonany na podstawie stanu obiektu możemy użyć przełącznika - switch.

Instrukcja if / if else

Najprostszą instrukcją warunkową jest instrukcja if:

if

(

warunek_logiczny

){

//instrukcje wykonane jeżeli warunek jest PRAWDZIWY

}

odmianą tej instrukcji jest instrukcja if else:

if

(

warunek_logiczny

){

//instrukcje wykonane jeżeli warunek jest PRAWDZIWY

}

else

{

//instrukcje wykonane jeżeli warunek jest FAŁSZYWY

}

instrukcje można zagłębiać:

if

(

warunek_logiczny1

){

if

(

warunek_logiczny2

){

//instrukcje wykonane jeżeli warunek2 jest PRAWDZIWY

}

}

oraz dokonywać wielokrotnego wyboru:

if

(

warunek_logiczny1

){

//instrukcje wykonane jeżeli warunek1 jest PRAWDZIWY

}

else

if

(

warunek_logiczny2

){

//instrukcje wykonane jeżeli warunek2 jest PRAWDZIWY

}

else

{

//instrukcje wykonane jeżeli warunek1 i warunek 2 są FAŁSZYWE

}

Operator trójargumentowy ? :

Jeżeli chcemy, aby zmienna przyjęła jakąś wartość w zależności od warunku logicznego możemy, zamiast bloku
if else, użyć specjalnego operatora trójargumentowego:

zmienna = warunek ? wartosc_jak_prawda : wartosc_jak_falsz;

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

7 z 12

2010-02-11 13:21

background image

Jest to szybsza i czytelniejsza forma od:

if

(

warunek

){

zmienna = wartosc_jak_prawda;

}

else

{

zmienna = wartosc_jak_falsz;

}

Blok switch

Jeżeli chcemy, aby jakoś kod został wykonany w momencie gdy zmienna znajduje się w określonym stanie to
możemy użyć bloku switch:

switch

(

key

)

{

case

value1:

// instrukcje dla key równego value1
break;

case

value2:

// instrukcje dla key równego value2
break;
default:
break;

}

W języku Java klucz (key) może być tylko typu int lub char (ten jest odczytywana jako liczba z tablicy
unicode), a od wersji 1.5 też enum (coś podobnego do znanych z C/C++ struktur). Warto zauważyć iż słowo
kluczowe break jest obowiązkowe. Jeżeli nie użyjemy go to instrukcje będą dalej przetwarzane. Zatem
rezultatem takiego kodu:

int

i =

0

;

switch

(

i

)

{

case

0

:

System

.

out

.

println

(

0

)

;

case

1

:

System

.

out

.

println

(

1

)

;

break;
default:

System

.

out

.

println

(

"default"

)

;

break;

}

będzie:

0
1

Pętle

Jeżeli chcemy wykonać jakiś fragment kodu wielokrotnie to możemy wypisać go explicite:

System

.

out

.

println

(

1

)

;

System

.

out

.

println

(

2

)

;

System

.

out

.

println

(

3

)

;

Takie rozwiązanie jest jednak złe. Co jeżeli chcemy wypisać np. wszystkie posty z forum? Jest tego trochę. W
dodatku liczba ta wciąż rośnie więc w momencie uruchomienia kodu na pewno nie będzie tam ostatnich
postów. Rozwiązaniem tego problemu jest specjalna instrukcja języka - Pętla. Ogólna zasada działania pętli jest
bardzo prosta i można ją ująć na trzy sposoby:

WYKONAJ POLECENIE N-KROTNIE
lub
WYKONAJ POLECENIE DOPÓKI SPEŁNIONY JEST WARUNEK
lub
WYKONAJ POLECENIE DLA KAŻDEGO ELEMENTU ZBIORU B

Tak oto zdefiniowaliśmy dwa podstawowe rodzaje pętli w Javie, a ogólniej w programowaniu.

Pętla for

Jest to pętla policzalna, czyli taka o której możemy powiedzieć iż wykona się określoną liczbę razy. Ogólna
składnia pętli for wygląda w następujący sposób:

for

(

int

i =

0

; warunek; krok

){

//instrukcja

}

Uwagi:

Zmienną i nazywamy Indeksem Pętli
Indeks może być dowolnym typem prostym poza boolean. Typ char ograniczony jest do 65535
Warunek może być dowolnym zdaniem logicznym, należy jednak zwrócić uwagę by nie była to
tautologia. Otrzymamy wtedy pętle nieskończoną
Krok pętli może być dowolny jednak tak samo jak w przypadku warunku trzeba uważać na zapętlenie się
programu.

Gdzie należy używać pętli for? Odpowiedź na to pytanie jest jedną z kwestii spornych i wywołuje gorące
dyskusje. Pętla ta najlepiej sprawdza się gdy chcemy wykonać jakąś operację na wszystkich elementach
tablicy. Jest naturalną i najbardziej czytelną dla tego typu problemów:

int

[]

a = new

int

[]

{

1

,

2

,

3

}

;

for

(

int

i =

0

; i < a.

length

; i++

)

{

System

.

out

.

println

(

a

[

i

])

;

}

Odmianą pętli for wprowadzoną w wersji 1.5 jest wersja przyjmująca dwa argumenty. Iterator i warunek.
Operuje on na kolekcjach. Przykład:

Collection<Object> col = new HashSet<Object>

()

;

col.

add

(

"a"

)

;

col.

add

(

"b"

)

;

for

(

Iterator<Object> it = col.

iterator

()

; it.

hasNext

()

;

){

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

8 z 12

2010-02-11 13:21

background image

System

.

out

.

println

(

it.

next

())

;

}

Pętle while i do while

Pętle while i do while są pętlami niepoliczalnymi, czyli takimi o których nie możemy powiedzieć ile razy się
wykonają. Ich składnia jest następująca:

while

(

warunekLogiczny

){

//instrukcja

}

/*---------*/

do

{

//instrukcja

}

while

(

warunekLogiczny

)

Uwagi:

warunek musi być zmienną boolean lub obiektem klasy java.lang.Boolean.

Obie te konstrukcje są bardzo podobne do siebie. Główna różnica polega na tym iż w pętli while warunek jest
sprawdzany przed wykonaniem instrukcji, a w pętli do while po wykonaniu instrukcji. Oznacza to, że pętla do
while wykona się co najmniej jeden raz. Poniższy przykład ilustruje różnicę:

int

i =

0

;

while

(

i <

1

)

{

System

.

out

.

println

(

"while "

+ i

)

;

i++;

}

do

{

System

.

out

.

println

(

"do while "

+ i

)

;

i++;

}

while

(

i <

1

)

;

Druga pętla wykona się pomimo iż warunek, 1 < 1, nie jest prawdziwy.
Kiedy używać? Najczęściej pętla while jest wykorzystywana do nasłuchiwania. Polega to na stworzeniu
nieskończonej pętli, najczęściej podając jako argument słowo true, której zadaniem jest wykonywanie danego
kodu nasłuchującego. Prosty szablon animacji:

while

(

animuj

){

//kod animacji

}

Dopóki flaga animuj jest prawdziwa wykonywana jest animacja. Podobnie ma się sprawa z prostymi serwerami
które nasłuchują w ten sposób na portach.

Pętla for element : Iterable

W raz nadejściem Javy w wersji 1.5.0 pojawiła się możliwość użycia konstrukcji for E : I. Ta zdawać by się
mogło dziwaczna konstrukcja jest w rzeczywistości odpowiednikiem pętli foreach. Jako argument przyjmuje
tablicę lub obiekt klasy implementującej interfejs Iterable. Przykład:

List<Object> l = new LinkedList<Object>

()

;

l.

add

(

"a"

)

;

l.

add

(

"b"

)

;

for

(

Object

e : l

){

System

.

out

.

println

(

e.

toString

())

;

}

Gdzie stosować? Konstrukcja ta jest najodpowiedniejsza dla wszelkiego rodzaju list, kolekcji i wektorów.

Przerywanie i przechodzenie do następnego kroku w pętlach

Czasami zdarz się że chcemy przerwać lub pominąć krok pętli jeżeli spełniony jest jakiś warunek. Aby uzyskać
taki efekt musimy użyć jednego z dwóch słów kluczowych.

break

Jeżeli chcemy przerwać wykonanie pętli jeżeli spełniony jest jakiś warunek to musimy użyć słowa break:

int

i =

0

;

while

(

true

){

if

(

i==

5

)

break;

System

.

out

.

println

(

i

)

;

i++;

}

continue

Jeżeli chcemy pominąć jakiś krok w pętli to musimy użyć słowa continue:

for

(

int

i =

0

; i <

10

; i++

){

if

(

i ==

5

)

continue;

System

.

out

.

println

(

i

)

;

}

Podsumowanie pętli

Mamy trzy rodzaje pętli.
Różnią się one zasadą działania.
Należy uważać by nie popełnić błędu i nie stworzyć pętli nieskończonej

Tablice i Kontenery

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

9 z 12

2010-02-11 13:21

background image

Omówiliśmy już wszystkie najistotniejsze elementy języka Java. Jedną z ostatnich kwestii jakie zostaną
poruszone w tym artykule jest temat tablic i kolekcji.

Wyobraźmy sobie, że mamy do stworzenia kilka Obiektów tej samej Klasy. Możemy zrobić to na kilka
sposobów. Najprostszym jest zdefiniowanie ich jako kolejnych zmiennych:

Object

o1 = new

Object

()

;

Object

o2 = new

Object

()

;

Object

o3 = new

Object

()

;

Metoda ta posiada wiele wad:

tworzymy dużo dodatkowego kodu
tworzymy wiele zmiennych
chcąc wykonać operację na każdym z obiektów musimy duplikować kod

Chcąc uniknąć tych nieprzyjemności możemy wykorzystać jeden z mechanizmów do obsługi zbiorów obiektów.

Tablice

Kontener na dane, w którym do każdej z komórek można odwołać się za pomocą klucza.
Klucz jest co do zasady wartością numeryczną.

Najprostszym opisem tablicy jest porównanie jej do tabeli w której każda komórka ma zwój unikatowy numer.
Za pomocą numeru możemy odwołać się do komórki i pobrać lub umieścić w niej pewną daną. Java pozwala na
definiowanie tablic na kilka sposobów:

// n - wielkość tablicy

Object

[]

o1;

o1 = new

Object

[

n

]

;

Object

o2

[]

=

{

new

Object

()

, new

Object

()}

;

int

[]

i = new

int

[

10

]

;

Komórki w tablicach są numerowane od 0. Oznacza to, że ostatni element znajduje się w komórce o numerze o
jeden mniejszym od długości tablicy. Tablica może mieć maksymalnie 2^31 -1 komórek. Uwaga! Inicjacja
tablicy o maksymalnej długości może spowodować błąd przepełnienia stosu.
Jeżeli chcemy otrzymać wartość elementu na pozycji m to wystarczy odwołać się do niego w ten sposób:

int

elementM = i

[

m

]

;

Tablica nawet jeżeli jest talbicą typów prostych to jest też Obiektem. Warto o tym pamiętać ponieważ częstym
błędem jest porównywanie tablic w taki oto sposób:

Object

[]

o1;

o1 = new

Object

[

2

]

;

o1

[

0

]

= new

Object

()

;

o1

[

1

]

= new

Object

()

;

Object

[]

o2 =

{

new

Object

()

, new

Object

()

}

;

System

.

out

.

println

(

"== "

+

(

o1 == o2

))

;

System

.

out

.

println

(

"equals "

+ o1.

equals

(

o2

))

;

/***
== false
equals false
**/

Jedyną prawidłową metodą jest porównanie każdego elementu tablicy z elementem o takim samym indeksie w
drugiej tablicy:

public

boolean

porownaj

(

Object

[]

o1,

Object

[]

o2

)

{

if

(

o1 == null || o2 == null

)

return false;

if

(

o1.

length

!= o2.

length

)

return false;

for

(

int

i = o1.

length

-

1

; i >=

0

; i--

)

{

if

(

!o1

[

i

]

.

equals

(

o2

[

i

]))

return false;

}

return true;

}

Java umożliwia też na tworzenie tablic wielo wymiarowych:

Object

[][]

o3 =

{

{

new

Object

()

, new

Object

()

}

,

{

new

Object

()

, new

Object

()

}

}

;

Object

[]

o4

[]

;

o4 = new

Object

[

10

][

10

]

;

Object

[][]

o5 = new

Object

[

2

][]

;

o5

[

0

]

= new

Object

[

10

]

;

o5

[

1

]

= new

Object

[

1

]

;

jak widać każda tablica w tablicy jest niezależna zmienna o5 to tablica dwuwymiarowa w której pierwszy
wymiar ma krotność 2, a poszczególne komórki tego wymiaru odpowiednio 10 i 1.

Ostatnią istotną kwestią dotyczącą tablic jest zagadnienie inicjacji wartości komórek. Tablica jest inicjowana na
tych samych zasadach co obiekt to znaczy:

jeżeli tablica jest polem Klasy to jest inicjowana na null. Nie posiada rozmiaru.
jeżeli tablica jest zmienną lokalną to nie jest inicjowana i trzeba ją inicjować ręcznie.

Co jednak z poszczególnymi komórkami? Jeżeli tablica zostanie zainicjowana to wszystkie komórki zostaną
zainicjowane tak jak by były polami obiektu i przyjmą wartości domyślne. Przykład:

Object

o6

[]

= new

Object

[

2

]

;

System

.

out

.

println

(

o6

[

0

])

;

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

10 z 12

2010-02-11 13:21

background image

int

[]

j = new

int

[

2

]

;

System

.

out

.

println

(

j

[

0

])

;

Kontenery

Jednym z ograniczeń tablic jest ich ograniczona wielkość. Ograniczona zarówno w sensie ilości elementów, ale
też zmiany rozmiarów tablicy. Chcąc zaradzić temu problemowi Java posiada dość pokaźny zbiór klas i
interfejsów rożnych typów kontenerów.

Kontener (ang. collection) jest to struktura pozwalająca na przechowywanie danych w
sposób uporządkowany. Posiada mechanizmy dodawania, usuwania i zamiany elementów.

Pakiet java.util zawiera w sobie wszystkie najważniejsze rodzaje kontenerów, a są to:

Listy

Lista to uporządkowany zbiór danych. Do elementu listy można dostać się za pomocą podania wartości indeksu.
Interfejs

java.util.List

pozwala na przechowywanie danych w postaci list wiązanych, list opartych o tablice,

stosu, wektora.

Mapy

Mapy pozwalają na dostęp do obiektów na podstawie wartości klucza. Każdy element mapy składa się z pary .
Interfejs

java.util.Map

pozwala na stworzenie map opartych o hasz jak też o drzewa.

Set

Jest to specyficzny rodzaj kontenera, w którym obiekty przechowywane nie mogą się powtarzać. Interfejs

java.util.Set

pozwala na przechowywanie danych w postaci listy wiązanej bez powtórzeń, drzewa, kolekcji

opartej o funkcję skrótu (hasz).

Kolejka

Kolejka jest to rodzaj kontenera pozwalający na dostęp do danych w oparciu o algorytmy FIFO i LIFO. Interfejs

java.util.Queue

pozwala na stworzenie kolejek blokujących, synchronizowanych i innych.

Podsumowanie

Jak można zauważyć tablice i kontenery mają swoje wady i zalety. Wybierając kontener należy kierować się
kilkoma prostymi pytaniami:

czy wielkość zbioru jest stała?
czy ilość dostępów do elementów w środku zbioru jest duża?
czy ilość wstawień w środku zbioru jest duża?
czy elementy mogą się powtarzać?

Odpowiedzi na te pytania pozwolą na określenie jakiego typu kontenera należy użyć.

Kategoria

:

Java

Ostatnia modyfikacja

02-07-2009 13:27

Ostatni autor

Koziołek

Ilość wyświetleń

81358

Wersja

30

wojciech.kwasniewski

dnia 24-07-2008 15:04

przy operatorach logiczny jest chyba maly blad. operator lgoczny "i" to && a nie $$, ale to tylko
literowka.

pozdrawiam
wk

Marek K

dnia 28-09-2007 22:17

Dzięx Koziołek.
Nie wiedziałem o tym - jestem świeżak

Koziołek

dnia 28-09-2007 21:50

Koziołek napisał:

No to zostały jeszcze modyfikatory do opisania.... ale to chyba już po obronie

co powiedział to zrobił. Dziś się obroniłem więc pojawiły się uzupełnienia.

Koziołek

dnia 28-09-2007 19:31

@Marek K, tak ale char zostanie rzutowany do int'a o wartości takiej jak kod w utfie znaku

Marek K

dnia 28-09-2007 16:11

Mała uwaga do instrukcji switch:
jako klucz może być podana zmienna także typu char.
Dowód:

public class Switch
{
public static void main (String[]args)

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

11 z 12

2010-02-11 13:21

background image

{
char c = 'e';
switch (c )
{
case 'a':
System.out.println("Instrukcja 1"); // instrukcje dla key rownego value a
break;
case 'b':
System.out.println("Instrukcja 2"); // instrukcje dla key rownego value b
break;
default:
System.out.println("Instrukcja domyslna");
break;
}
}
}

pzdr

Koziołek

dnia 19-06-2007 01:13

No to zostały jeszcze modyfikatory do opisania.... ale to chyba już po obronie

Koziołek

dnia 19-06-2007 00:27

jak obiecał tak zrobił... zniknęło wieczorkiem.... kilka tygodni później

ale wieczorkiem

Koziołek

dnia 13-06-2007 16:06

Akurat to nie moje

ale dobra wieczorkiem zniknie

A ja tu siedzę i szukam takiego buraka w operatorach

Marooned

dnia 13-06-2007 15:47

Też jestem za wywaleniem tego "- || -" i wpisaniem tam tego, czego potrzeba. Bez przesady

Marek_SP - nie wiem, czy ta forma Pythona jest taka czytelna. Może dla człowieka w sensie języka
naturalnego - ale dla kogoś, kto zna wiele języków formalnych to kolejne zamieszanie i niepotrzebne
mącenie w głowie. Ot, takie moje zdanie.

A operator ?: to ternariusz - tak przynajmniej kiedyś znalazłem. Jedyny operator trójargumentowy.

Koziołek

dnia 02-06-2007 14:04

@Wolverine, ale o co chodzi???

Wolverine

dnia 02-06-2007 13:29

"- || -" - nie chcialo ci sie tekstu skopiowac? o_O

Marek_SP

dnia 29-05-2007 16:44

zmienna = warunek ? wartosc_jak_prawda : wartosc_jak_falsz;

Jesto to szybsza i czytelniejsza forma.

W Pythonie to jest dopiero czytelna forma:

zmienna = wartosc_jak_prawda if warunek else wartosc_jak_falsz

Koziołek

dnia 29-05-2007 00:16

OK. trzeba dodać kawałek o pętlach i klasach. generalnie złączyć z

http://4programmers.net

/Java/Podstawy_Javy_cd.

bo nie ma się co bawić w rozbijanie tego na kilka artykułów. W drugim tekście

można co najwyżej przedstawić dokładnie kompilator.

kopciej2001

dnia 01-04-2005 12:31

brakuje instrukcji: warunek ? warunek spelniony: warunek nie spelniony

gaborek

dnia 13-04-2003 10:06

w tych konstrukcjach "if" to warto dodac ze jesli sie chce wstawic wiecej instrukcji niż jedną to nalezy je
umieścić w bloku czyli pomiedzy { }
,a tak poza tym to tak po macoszemu potraktowany temat. NO ale jest wsrod 4 najlepszych o javie na
tej stronie

filip

dnia 07-02-2003 12:31

Mała uwaga do instrukcji switch:
po instrukcji (bloku instrukcji) w ramach case warto pamiętać o wstawieniu instrukcji 'break;'
powodującej wyskok ze switch'a, gdyż w przeciwnym wypadku pozostałe instrukcje (pozostałe case)
zostaną ciurkiem wykonane (chyba że o to właśnie chodzi) .

Dodaj komentarz

Java :: Podstawy Javy - 4programmers.net

http://4programmers.net/java/Podstawy_Javy#id-Operatory-matematyczne

12 z 12

2010-02-11 13:21


Wyszukiwarka

Podobne podstrony:
Hello Android Programowanie na platforme Google dla urzadzen mobilnych handro
Hello Android Programowanie na platforme Google dla urzadzen mobilnych Wydanie III handro
Hello Android Programowanie na platforme Google dla urzadzen mobilnych Wydanie III
Hello Android Programowanie na platforme Google dla urzadzen mobilnych Wydanie III 2
Podstawa programowa dla gimnazjum
program dla zandarmerii wojskowej 1
Planowanie programu dla zdrowia Nieznany (4)
PROGRAMOWANIE w c dla chetnych
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
Indywidualny program dla dziecka, dla dzieci, rewalidacja indywidualna
Charakterystyka nowej podstawy programowej dla przedszkoli i klas początkowych, Współczesne koncepcj
Planowanie programu dla zdrowia Nieznany
INDYWIDUALNY PROGRAM DLA DZIECKA Z ZESPOŁEM DOWNA I NIEPEŁNOSPRAWNOŚCIĄ INTELEKTUALNĄ W STOPNIU UMIA
Andragogika program dla studentĂlw
Planowanie programu dla zdrowia Nieznany (5)
programowanie dla walka w cnc predk skraw Przyklad recz progr OSN

więcej podobnych podstron