Przemysław Wionczyk
JAVA
Klasy i obiekty
Klasy i obiekty
1 / 15
Przemysław Wionczyk
JAVA
Wstęp
Język Java został zaprojektowany jako język w pełni obiektowy. To
oznacza, że wszystko poza typami prostymi, które poznaliśmy wcześniej
jest obiektem. Poza tym wszystkie obiekty są dostępne tylko poprzez
referencję. W języku C++ mogliśmy tworzyć bezpośrednio zmienne
obiektowe lub wskaźniki na obiekty (referencje). W Javie mamy sytuację
uproszczoną, bo nie mamy wyboru, wszystko co nie jest zmienną typu
podstawowego jest referencją.
2 / 15
Przemysław Wionczyk
JAVA
Klasy
W języku Java klasy dzielimy na publiczne i pakietowe. Pisząc
przed nazwą klasy tylko słowo class tworzymy klasę pakietową. Podając
przed słowem class specyfikator dostępu public tworzymy klasę
publiczną. Klasa publiczna jest dostępna dla wszystkich innych klas.
Klasa pakietowa jest dostępna jedynie wewnątrz danego pakietu, np. dla
wszystkich klas w jednym katalogu tworzących jedną aplikację.
W jednym pliku może się znajdować tylko jedna klasa publiczna,
ale razem z nią może być tam wiele klas pakietowych. Nazwa takiego
pliku musi być identyczna z nazwą klasy (wielkość liter też jest ważna).
3 / 15
Przemysław Wionczyk
JAVA
Zawartość klas
Klasy mogą zawierać pola (zmienne) oraz metody (czyli funkcje).
Przykładowa klasa przechowująca punkt na ekranie może wyglądać tak:
public class Punkt {
int x, y;
int getX() {
return x;
}
int getY() {
return y;
}
}
4 / 15
Przemysław Wionczyk
JAVA
Aby stworzyć referencję do tej klasy możemy napisać:
Punkt punkt;
To stworzyło nam zmienną (referencję) do obiektu klasy Punkt, ale nie
stworzyło jeszcze samego obiektu, zatem nie da się przechowywać nic
pod tą zmienną. Aby umieścić tam obiekt, należy napisać:
punkt = new Punkt();
To tworzy nam nowy obiekt klasy Punkt (poprzez wywołanie
konstruktora klasy Punkt) i przypisuje ten obiekt do zmiennej punkt.
Można połączyć te czynności i stworzyć równocześnie zmienną i obiekt:
Punkt punkt = new Punkt();
5 / 15
Przemysław Wionczyk
JAVA
Korzystanie z obiektów
Podobnie jak przy obiektach w C++, do składowych obiektu
odwołujemy się przy użyciu kropki:
System.out.println(punkt.x);
int a = punkt.getX();
Możemy też referencję ze zmiennej punkt skopiować do innej, nowo
utworzonej zmiennej, która od tego momentu będzie wskazywała na ten
sam obiekt:
Punkt punktA = punkt;
6 / 15
Przemysław Wionczyk
JAVA
Specyfikatory dostępu
Do pól i metod możemy ograniczać dostęp podobnie jak w C++,
czyli dopisując specyfikator dostępu. Mamy do dyspozycji 4 możliwości:
•
public – publiczne pola i metody będą dostępne dla wszystkich (ten
typ dostępu widzieliście już przy głównej funkcji programu – main,
•
private – pola i metody dostępne tylko wewnątrz danej klasy,
•
protected – dostępne dla danej klasy i klas dziedziczących,
•
brak specyfikatora – oznacza dostęp pakietowy, działający tak jak
opisałem przy klasach.
7 / 15
Przemysław Wionczyk
JAVA
Specyfikatory dostępu
public class Punkt {
private int x, y;
// dostęp tylko dla funkcji w klasie
public int getX() {
// dostęp dla wszystkich
return x;
}
protected int getY() {
// dostęp wewnątrz klasy
return y;
// i klas potomnych
}
}
Private powinniśmy używać do prawie wszystkich pól i niektórych
wewnętrznych funkcji klasy, do reszty dostęp może być swobodniejszy.
8 / 15
Przemysław Wionczyk
JAVA
Konstruktor
Tak jak w C++, mamy możliwość definiowania specjalnych metod
nazywanych konstruktorami, które są uruchamiane przy tworzeniu
obiektu danej klasy. Konstruktory nigdy nie zwracają wyniku. Tak jak
w C++ mamy możliwość zdefiniowania kilku różnych konstruktorów dla
jednej klasy. Konstruktory te muszą różnić się ilością lub rodzajem
parametrów.
9 / 15
Przemysław Wionczyk
JAVA
Konstruktor
public class Punkt {
private int x, y;
public Punkt() {
x = 100;
y = 200;
}
public Punkt(int a, int b) {
x = a;
y = b;
}
}
10 / 15
Przemysław Wionczyk
JAVA
Przeciążanie metod
Możliwość stworzenia dwóch konstruktorów o różnych
parametrach, tak samo jak dowolnych funkcji o tej samej nazwie, które
różnią się listą przyjmowanych argumentów lub typem zwracanej
wartości nazywamy przeciążaniem metod. Sama metoda
System.out.print ma kilkanaście przeciążonych wersji przyjmujących
zmienne różnych typów (od liczb całkowitych, poprzez rzeczywiste, aż
do tablic znaków, a nawet obiektów).
11 / 15
Przemysław Wionczyk
JAVA
Zadanie 1
Napisz publiczną klasę Circle zawierającą metody liczące obwód
i pole koła (jako parametr tych funkcji mamy mieć promień). W drugim
pliku napisz klasę Figury z funkcją main i wykorzystaj klasę Circle do
obliczeń dla podanego przez użytkownika promienia.
12 / 15
Przemysław Wionczyk
JAVA
Zadanie 2
Dopisz publiczne klasy Prostokąt i Trójkąt w których zawrzesz
metody liczące pola i obwody. W klasie Trójkąt skorzystaj z przeciążania
metod i zawrzyj różne metody o tej samej nazwie liczące pole różniące
się od siebie argumentami:
•
podstawa i wysokość (liczby rzeczywiste),
•
trzy boki (liczby rzeczywiste, wzór Herona),
•
dwa boki (liczby rzeczywiste) i kąt między nimi (wartość całkowita
w stopniach).
13 / 15
Przemysław Wionczyk
JAVA
Rozbuduj główną klasę z zadania 1 o menu w którym użytkownik
wybiera figurę, potem ewentualnie wybiera co dla danej figury chce
podać (tylko dla trójkąta) a następnie program wylicza mu pole i obwód
tej figury.
14 / 15
Przemysław Wionczyk
JAVA
Zadanie 3
Napisz klasę Trójmian z konstruktorem bezparametrowym
(ustawiającym a=1, b=3, c=2) oraz z trzema parametrami a, b, c. Klasa ta
ma mieć funkcje liczące współrzędne wierzchołka (p i q), deltę, ilość
miejsc zerowych, pierwsze miejsce zerowe, drugie miejsce zerowe (jeśli
jest jedno, to wynik z obydwóch powinien być taki sam). Następnie
przetestuj tę klasę pisząc kolejną z funkcją main w której użytkownik
podaje współczynniki trójmianu, program tworzy odpowiedni obiekt
trójmianu, potem użytkownik z menu wybiera jedną z opcji programu,
które liczą różne rzeczy przy pomocy tej klasy Trójmian.
15 / 15