Do jej utworzenia można użyć także standardowego operatora new w postaci:
new typ_tablicy[liczba_elementów][licz-ba_elementów];
KLASY I OBIEKTY
Budowa klasy
Definicja klasy ma schematyczną postać: class nazwa_klasy
{
//treść klasy //definicja pól i metod
ł
Przykład:
class Punkt {
int x; int y;
}
IWorzenie obiektów
Zmienna typu obiektowego (klasowego, referencyjnego) tworzona jest za pomocą konstrukcji: nazwa_klasy nazwa_zmiennej;
Do tak zadeklarowanej zmiennej można przypisać obiekt utworzony za pomocą operatora new: new nazwa_klasy;
jednoczesna deklaracja zmiennej, utworzenie obiektu i przypisanie go do zmiennej odbywa się za pomocą schematycznej konstrukcji:
nazwaklasy nazwa_zmiennej = new nazwa_klasy();
Przykład:
Punkt mojPunkt = new Punkt();
Pola klas
Definicje pól
Pola definiowane są w ciele klasy, w sposób identyczny jak zwykłe zmienne. Najpierw należy podać typ pola, a po nim jego nazwę:
class nazwaklasy {
typ_polal nazwapolal; typ pola2 nazwa_pola2;
//.:.
typ polan nazwa_polan;
)
Odwołania do pól obiektu
Po utworzeniu obiektu do jego pól można odwoływać się za pomocą operatora. (kropka), schematycznie: nazwaobi ektu.nazwapola;
Przykład:
Punkt punktl ■ new Punkt(); punktl.x = 100; punktl.y » 200;
Wartości domyślne pól
Każde niezainicjowane pole klasy otrzymuje wartość domyślną, zależną od jego typu. Wartości te zaprezentowane są w poniższej
tabeli. | |
Typ |
Wartość domyślna |
byte |
0 |
short |
0 |
int |
0 |
long |
0 |
float |
0,0 |
double |
0,0 |
char |
\o |
boolean |
false |
obiektowy |
nuli |
Metody klas
Definicje metod
Hetody definiowane są w ciele klasy pomiędzy nawiasami klamrowymi. Każda metoda może przyjmować parametry oraz zwracać wynik. Schematyczna deklaracja metody wygląda następująco:
typ_wyniku nazwa metody(parametry_metody) {
//instrukcje metody }
Po umieszczeniu w ciele klasy deklaracja taka będzie wyglądała natomiast tak:
class nazwaklasy
typ_wyniku nazwa_metody(parametry metody)
{
//instrukcje metody
}
}
Jeśli metoda nie zwraca żadnego wyniku, jako typ wyniku należy zastosować słowo voi d, jeśli natomiast nie przyjmuje żadnych parametrów, pomiędzy nawiasami okrągłymi nie należy nic wpisywać.
Przykład: class Punkt {
int x; int y;
void wyswietlWspolrzedne()
{
System.out.println("współrzędna x ■ " + x);
System.out.println("współrzędna y ■ "
♦ y);
}
}
Odwołania do metod obiektu
Po utworzeniu obiektu do jego pól można odwoływać się za pomocą operatora . (kropka), schematycznie: nazwa_obiektu.nazwa_metody();
Przykład:
Punkt punktl » new Punkt(); punktl.wyswietlWspol rzedne();
Argumenty metod
Metoda może mieć dowolną liczbę argumentów umieszczonych w nawiasach okrągłych za jej nazwą. Poszczególne argumenty należy oddzielić od siebie znakami przecinka. Schematycznie:
typ_wyniku nazwa_metody(typ_parametru_l nazwa_parametru_l, typ_parametru_2 nazwa_parametru_2, ... , typ_parametru_n nazwa_parametru_n)
Przykład:
void ustawXY(int wspX, int wspY)
{
x = wspX; y = wspY;
I
Argumentami mogą być zarówno typy proste, jak i typy obiektowe.
Przeciążanie metod
W każdej klasie mogą istnieć dwie (lub więcej) metody, które mają takie same nazwy, o ile tylko różnią się przyjmowanymi parametrami. Mogą (ale nie muszą) się one również różnić typem zwracanego wyniku. Technika ta nosi nazwę przeciążania metod. Przykład: public class Punkt {
int x; int y;
void ustawXY(int wspX, int wspY)
{
x = wspX; y = wspY;
}
void ustawXY(Punkt punkt)
ł
x ■ punkt.x; y = punkt.y;
}
)
Rodzaje klas
Klasy w jawie dzielą się na trzy typy:
• klasy publiczne,
• klasy pakietowe.
• klasy wewnętrzne.
jeśli przed nazwą klasy nie znajduje się modyfikator publ i c. jest to klasa pakietowa, czyli klasa dostępna jedynie dla innych klas z tego samego pakietu. Jeśli natomiast przed nazwą klasy znajduje się modyfikator publ i c, jest to klasa publiczna, czyli klasa dostępna dla wszystkich innych klas.
Przykład:
int tab[][] = new int[2] [4]; int count = 1; for(int i = 0; i < 2; i++){ for(int j » 0; j < 4; j++){ tab[i][j] = count++;
}
}
Deklaracja klasy publicznej ma postać:
public class nazwa_klasy
//pola i metody klasy
Deklaracja klasy pakietowej ma postać:
class nazwa_klasy
ł
//pola i metody klasy
Klasy wewnętrzne to klasy zdefiniowane wewnątrz innych klas.
Postać schematyczna:
[specyfikator dostępu] class klasa_zewnetrzna
i
[specyfikaotr dostępu] class klasa wewnętrzna {
//pola i metody klasy wewnętrznej t
//pola i metody klasy zewnętrznej
Przykład klasy wewnętrznej:
public
class Outside
class Inside
Definicja konstruktora
Konstruktor jest to specjalna metoda, która jest wywoływana zawsze po utworzeniu obiektu w pamięci. Metoda będąca konstruktorem nigdy nie zwraca żadnego wyniku i musi mieć nazwę zgodną z nazwą klasy, czyli schematycznie:
public
class nazwa klasy {
nazwa_klasy()
{
//kod konstruktora
}
}
Przykład:
public class Punkt {
int x; int y;
Punkt()
{
x = 1; y - 1;
)
}
Argumenty konstruktorów
Konstruktor może być bezargumentowy, może też przyjmować argumenty, które zostaną wykorzystane (bezpośrednio lub pośrednio) do zainicjowania pól obiektu. Argumenty przekazuje się dokładnie w taki sam sposób, jak w przypadku zwykłych metod, schematycznie: class nazwa klasy {
nazwa_klasy(typl argument 1, typ2 argument2,..., typn argumentn)
{
//kod konstruktora
}
}
Przykład:
public class Punkt {
int x; int y;
Punkt(int wspX, int wspY)
{
x ■ wspX; y = wspY;
}
Wywołanie konstruktora
Konstruktor wywoływany jest automatycznie w trakcie tworzenia obiektu danej klasy, czyli po wykonaniu instrukcji: new nazwa Jclasy();
Jeżeli konstruktor wymaga podania argumentów, należy umieścić je w nawiasach okrągłych, tak jak w przypadku zwykłej metody: new nazwa_klasy(parametry konstruktora); Przykład:
Punkt punktl = new Punkt(100, 200);
Przeciążanie konstruktorów
Konstruktory, tak jak zwykle metody, mogą być przeciążane, tzn. każda klasa może mieć kilka konstruktorów, o ile tylko różnią się one przyjmowanymi argumentami.
Przykład:
class Punkt {
int x; int y;
Punkt()
{
x ■ 1;
}
Punkt(int x, int y)
{
this.x ■ x; this.y - y;
)
Punkt(Punkt punkt)
{
x = punkt.x; y « punkt.y;
}
}
Konstruktor domyślny
jeżeli w klasie nie zostanie zdefiniowany żaden konstruktor, zostanie do niej automatycznie dodany bezargumentowy konstruktor domyślny. Klasa taka będzie się zatem zachowywała tak. jakby miała schematyczną postać:
public
class nazwa_klasy
ł
nazwa_klasy()
{
}
//pola i metody klasy
}
jeżeli w klasie zostanie jawnie zdefiniowany konstruktor bezargumentowy, automatycznie stanie się konstruktorem domyślnym (jest to ważne przy dziedziczeniu), niezależnie od tego, czy istnieją inne konstruktory.
Słowo kluczowe thi s to odwołanie do obiektu bieżącego, można je traktować jako referencję do aktualnego obiektu. Odwołanie do pól i metod poprzez obiekt thi s odbywa się za pomocą operatora . (kropka):
this.nazwa_pola = wartość; this.nazwa_metody(argumenty);
Umożliwia to m.in. stosowanie w metodach i konstruktorach argumentów o nazwach identycznych z nazwami pól klasy. Przykład: public class Punkt {
int x; int y;
Punkt(int x, int y)
{
this.x = x; this.y ■ y;
)
}
Składowe statyczne to pola i metody klasy, które mogą istnieć, nawet jeśli nie istnieje obiekt tej klasy. Każda taka metoda lub pole są wspólne dla wszystkich obiektów tej klasy. Składowe te oznaczane są słowem static.
Metody statyczne
Metody statyczne oznacza się słowem static, które zwyczajowo powinno znaleźć się zaraz za specyfikatorem dostępu, schematycznie:
modyfikator_dostępu static typ_zwracany nazwajnetody(argumenty)
//treść metody
}
Przykład:
public class A {
public static void f()
{
System.out.println("Metoda f klasy A");
Tak napisaną metodę można wywołać klasycznie, to znaczy po utworzeniu obiektu klasy A, np. w postaci:
A a = new A(); a.f();
Ponieważ jednak metody statyczne istnieją nawet wtedy, kiedy nie ma żadnego obiektu danej klasy, możliwe jest wywołanie w postaci:
Ogólniej metodę statyczną można wywołać w postaci: nazwa_kl asy. nazwajnetody (argumenty metody);
bez konieczności tworzenia obiektu danej klasy.
3