Jason. Cała informatyka w jednym miejscu!

Czy jesteś gotowy(-a) na artykuł o Javie, w którym pokażę Ci KLUCZOWY element całego języka 😯? Tematem będzie tworzenie klas używając słowa kluczowego jakim jest "class" w języku Java!!! Czas zapoznać się z klasami, które są nieodłącznym budulcem każdego (serio każdego) programu jaki został wytworzony przy pomocy języka Java 😳!

TAM, GDZIE JEST "CLASS" W JĘZYKU JAVA, TAM RODZI SIĘ NOWY TYP DANYCH!

Klasa z definicji jest gotowym wzorcem dla tworzonych obiektów. Obiekt (nazywany instancją) powstaje właśnie na bazie swojej klasy i z technicznego punktu widzenia jest jej kopią. Każda klasa może posiadać swoje składowe, które dzielą się na dwie części:

  • dane, czyli zmienne kontrolujące stan obiektu,
  • metody, czyli funkcje określające zachowanie obiektu.

Wynika z tego, że klasa może być postrzegana jako całkowicie osobny typ danych. Jeżeli obiekt "pochodzi" od klasy, to zmienna przyjmuje klasowy typ danych (tak naprawdę to przechowuje referencję do obiektu, lecz więcej info zostawię na końcu). Zwróć uwagę, że w kontekście klasy posługujemy się innymi terminami. Nie ma zmiennych - są dane (rozwijane do hasła "dane składowe"). Nie ma funkcji - za to są metody (de facto każda z nich jest metodą, bo każda znajduje się w klasie bez wyjątku). Tego się trzymamy 😊!

DEFINICJA KLASY

Żeby zdefiniować klasę, wystarczy utworzyć nowy plik źródłowy z rozszerzeniem ".java" i w środku niego posłużyć się słowem kluczowym "class". Każda klasa musi mieć dla siebie osobny plik źródłowy. "class" w języku Java jest "sztandarowym" słowem kluczowym jakie znajduje się w 100% kodów źródłowych na świecie ✔️. Każdy, nawet najmniejszy program, musi posiadać przynajmniej jedną klasę. A to dlatego, że funkcja uruchomieniowa "main" (tak zresztą jak każda inna funkcja), musi się znaleźć właśnie w środku klasy!

Definicja zwykle wygląda tak, na razie bez szczegółów w środku niej:

public class MyClass {
	// dane
	
	// metody
}

Pierwszy jest modyfikator dostępu. Dla klas nadaje się tylko i wyłącznie modyfikator "public" i kompilator zgłosi błąd, jeżeli znajdzie inne słowo kluczowe. Można nie wstawiać żadnego i wtedy klasa będzie widoczna wyłącznie w obrębie swojego pakietu. Pakiet w Javie to podzbiór plików źródłowych ugrupowanych w jednym katalogu. Zapraszam po więcej do osobnego artykułu.

Po słowie kluczowym "class" podajemy jej nazwę i tutaj też jest jasno ustalona zasada co do nazywania: każde pojedyncze słowo zaczynamy wielką literą ("PascalCase"), a nazwa ma przyjmować postać rzeczownika. Całość wieńczy para klamerek, a w środku umieszczamy dane składowe i metody. Teraz parę słów o nich.

DANE SKŁADOWE

Dane w postaci zmiennych zawsze znajdują się na samej górze klasy, zaraz pod jej nagłówkiem. Zapis nie różni się niczym od definiowania zmiennej poznanego w artykule o nich samych, poza jednym szczegółem na samym początku:

private int x;

Modyfikator dostępu! Kiedy zmienna jest częścią klasy, to powinna mieć modyfikator dostępu (więcej na ich temat w osobnym artykule). Jeżeli nie podamy go sami, Java przypisze domyślny "w ukryciu". Zmienna nie może go mieć, jeżeli znajduje się wewnątrz funkcji:

public void doSomething() {
	int x = 5;	// bez modyfikatora dostępu!
}

Ciebie mają interesować tylko dwa modyfikatory:

  • private,
  • protected (rzadko stosowany).

Chroniony modyfikator dostępu "protected" pozwala na uzyskanie dostępu do danej składowej przez wszystkie inne struktury znajdujące się w obrębie tego samego pakietu ORAZ przez wszystkie klasy potomne pochodzące od klasy zawierającą tę składową (dziedziczenie). Najczęściej jednak używa się wyłącznie modyfikatora "private", który jest najbardziej restrykcyjnym ze wszystkich modyfikatorów jakie występują w Javie. Nie bez powodu się z niego korzysta.

Powodem stosowania prywatnego modyfikatora dostępu jest ukrycie szczegółów implementacji przed światem zewnętrznym. Kiedy korzystamy z gotowych funkcjonalności, zwykle nas nie interesuje jak to jest robione za kulisami - chcemy otrzymać wynik końcowy i to wszystko. Ponadto, po wprowadzeniu aktualizacji kodu źródłowego, możemy się narazić na modyfikacje w naszym kodzie, jeżeli dane składowe uległy zmianie przez nazwę bądź typ danych (mogą nawet zostać usunięte!). Opakowanie modyfikacji i odczytu danych w metody, zmniejsza to ryzyko i taki jest powód ukrywania implementacji, do którego Ty też musisz się dostosować. Zatem, jeżeli nie masz jakichś szczególnych powodów udostępniania składowej dla klas potomnych, korzystaj tylko i wyłącznie z modyfikatora prywatnego!

Przykład klasy posiadającej trzy dane składowe wygląda tak:

public class MyClass {
	private int i;
	private float f;
	private String s;
}

Możesz oczywiście przypisać im wartości początkowe, które przyjmie obiekt po jego utworzeniu.

METODY

Metody (czyli funkcje) także powinny otrzymać ściśle zdefiniowany modyfikator dostępu, jednak tutaj użycie jest już bardziej rozległe w zależności od okoliczności. Często wstawia się "public", bo jakaś komunikacja na zewnątrz musi istnieć, aczkolwiek nie jest to regułą. Najpierw przykład:

public void doSomething() {
	// instrukcje
}

Po modyfikatorze dostępu, nadajemy typ zwracanej wartości, nazwę, obowiązkową parę nawiasów okrągłych, a w środku nich opcjonalnie parametry, klamerki i instrukcje wewnątrz nich. Było już o tym we właściwym wpisie.

Kiedy użyć jakiego modyfikatora dostępu?

  • "public", jeżeli masz pewność, że metoda będzie miała służyć wykonaniu operacji z poziomu innej klasy,
  • "private", jeżeli metoda ma wykonać jakieś operacje w środku tej samej klasy i nie ma potrzeby jej udostępniania.

Reszta nie będzie potrzebna, przynajmniej na początek zaznajamiania się z językiem Java 🙂.

Metody w języku Java są często stosowane do pobierania i modyfikowania danych składowych, które same w sobie są prywatne. Najczęściej będziesz widzieć takie postacie dla pojedynczej danej:

public int getX() {
	return x;
}

public void setX(int newX) {
	x = newX;
}

Pierwsza postać ma za zadanie zwrócić wartość danej (tzw. "getter", w polskim tłumaczeniu "akcesor"), a druga przypisuje nową wartość (tzw. "setter", w polskim tłumaczeniu "mutator"). Na koniec, przykład z metodami:

public class MyClass {
	private int i;
	private float f;
	private String s;
	
	public int getInt() {
		return i;
	}
	
	public float getFloat() {
		return f;
	}
	
	public String getString() {
		return s;
	}
	
	public void setInt(int newInt) {
		i = newInt;
	}
	
	public void setFloat(float newFloat) {
		f = newFloat;
	}
	
	public void setString(String newString) {
		s = newString;
	}
}

To wszystko, co musi się znaleźć wewnątrz klasy. Wiedz, że nie trzeba koniecznie wstawiać jakichkolwiek danych składowych albo metod. Język Java nie wymaga, aby znalazło się koniecznie i jedno, i drugie. Mogą na przykład znajdować się same metody i też program uruchomi się poprawnie.

Tworzenie klasy za pomocą słowa kluczowego "class" w języku Java

"class" w języku Java pozwala utworzyć nową klasę, która może dysponować własnymi danymi (zmiennymi kontrolującymi stan) i metodami (funkcjami kontrolującymi zachowanie).

TWORZENIE OBIEKTU NA PODSTAWIE KLASY

Przed nami druga strona, czyli utworzenie obiektu na podstawie naszego wzorca, czyli klasy. Gdy mamy już naszą klasę, możemy na jej podstawie zdefiniować zmienną, która będzie reprezentować klasę w postaci typu danych. Popatrz na przykład:

MyClass mc = new MyClass();

Zmienną klasową formułuje się inaczej, gdyż zamiast przypisania wartości, korzystamy z ciągu składającego się ze słowa kluczowego "new", nazwy klasy oraz tych samych nawiasów okrągłych, o których tłukłem Tobie podczas objaśniania funkcji 🤣. Nie mylisz się - to także jest wywołanie metody. A dokładniej, konstruktora klasy, który także jest metodą (jest osobny na to artykuł tłumaczący jak wygląda konstruktor). W związku z tym, również może przyjmować parametry i również posiadać własne instrukcje np. wywołujące swoje metody w chwili tworzenia obiektu 👍.

Nawet jeżeli nie zdefiniowałeś(-aś) konstruktora samodzielnie, to on i tak zostanie stworzony przez kompilator, w takiej oto postaci:

public MyClass() {
	
}

Wraz z utworzeniem obiektu, możemy się odwoływać do jego danych składowych i metod, lecz wtedy i tylko wtedy, gdy zezwala na to modyfikator dostępu! Korzystamy z kropeczki wstawianej zaraz po nazwie zmiennej:

mc.doSomething();

Wszystkie dane składowe otrzymują automatycznie wartości domyślne z chwilą utworzenia obiektu. Nie ma czegoś takiego jak w przypadku zmiennych w metodzie, gdzie trzeba jawnie zdefiniować wartość kiedy jest instrukcja wymagająca jej wartości aktualnej:

public void doSomething() {
	int x = 3;
	
	System.out.println(x);
}

Przykładowe wywołanie:

System.out.println(mc.getInt());

spowoduje wyświetlenie wartości 0, nawet jeżeli nie została wstawiona żadna wartość 😯!

Tworzenie obiektu w języku Java

Tworzenie obiektu w języku Java odbywa się przy pomocy słowa kluczowego "new" oraz wywołania konstruktora klasy zgodnie z listą parametrów.

CO SIĘ KRYJE ZA TWORZENIEM OBIEKTU?

W ramach ciekawostki, tłumaczę na sam koniec artykułu jak wygląda sprawa z tworzeniem zmiennej obiektowej, bo to jest bardzo uproszczone powiedzenie. Klasowy typ danych jest w rzeczywistości typem referencyjnym, co oznacza że kiedy dojdzie do wykonania takiej instrukcji:

MyClass mc = new MyClass();

zostanie przydzielona pamięć dla obiektu na strukturze danych nazywanej stertą. Sterta ma za zadanie nawiązać i utrzymać łączność z obiektami na podstawie adresu w systemie szesnastkowym. Powyższa instrukcja zwraca taki adres (referencję) i przypisuje go zmiennej. Zatem, zmienna typu klasowego przechowuje odwołanie do obiektu, a nie obiekt sam w sobie!

Kolejna istotna informacja jest taka, że właśnie dlatego, że przechowywana jest referencja do obiektu, wszystkie modyfikacje danych składowych wykonane w jakiejkolwiek metodzie zostaną utrwalone (w przeciwieństwie do typów prostych). Określa się to przekazywaniem przez referencję.


To by było tyle z najistotniejszych informacji na temat istoty słowa "class" w języku Java 🏆!

PODOBNE ARTYKUŁY