Przystępujemy do następnej części z cyklu "Dziedziczenie w języku Java". Jak wiemy z poprzedniej części, klasa abstrakcyjna pozwala nałożyć zabezpieczenie na tworzenie zbyt ogólnych obiektów. Teraz zapoznam Was z zabezpieczaniem od drugiej strony czyli sprawienie, aby dana klasa była ostatnim "potomkiem" w drzewie. Klasa finalna - oto czego Wam potrzeba!

DZIEDZICZENIE W JĘZYKU JAVA I FINAŁ

Gdy klasa jest finalna to znak, że nie można jej wykorzystać obok słowa "extends" w następnej klasie względem hierarchii dziedziczenia. Dziedziczenie w języku Java ma to do siebie, że można ograniczyć pole manewrów z obu stron. Od początku ogranicza "abstract", a "final" od końca. Oto kolejne słowo kluczowe Javy. To również może być traktowane jako zabieg kosmetyczny, aczkolwiek dzięki tej klauzuli można sprawić, że definicja danej klasy będzie niezmienna i definitywna. Dotyczy to również zmiennych i metod, natomiast to daje różne efekty.

Zmienne finalne są odpowiednikiem wartości stałych wyróżniających się w innych językach słowem "const", a gdy metoda jest finalna, to wówczas nie można jej przesłonić w następnych klasach dziedziczących. Jeżeli klasa jest finalna, to nie można jej wykorzystać do dalszego dziedziczenia. Takie występują różnice w zależności od tego, w którym miejscu wstawimy modyfikator "final".

PRZYKŁADOWY KOD ŹRÓDŁOWY

Na do widzenia, program wykorzystujący modyfikator "final" dla klasy. Przyjrzyjcie się uważnie jaki to ma wpływ na poszczególne fragmenty:

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		Warrior w = new Warrior(8);
		Swordsman s = new Swordsman(2);

		w.saySomething();
		s.saySomething();
	}
}
  • KLASA "Character"
public abstract class Character
{
	private int level;

	public void setLevel(int level)
	{
		this.level = level;
	}

	public void saySomething()
	{
		System.out.println("Wypowiadam się z klasy " + getClass().getSimpleName() + ". Mam poziom " + level);
	}
}
  • KLASA "Warrior"
public class Warrior extends Character
{
	private String ability;

	public Warrior(int level)
	{
		setLevel(level);
	}

	public Warrior(int level, String ability)
	{
		setLevel(level);
		setAbility(ability);
		activateAbility();
	}

	public void setAbility(String ability)
	{
		this.ability = ability;
	}

	public void activateAbility()
	{
		if(!ability.isEmpty())
		{
			System.out.println("Korzystam ze specjalnej mocy jaką ma klasa " + getClass().getSimpleName() + ". Jest to " + ability + "!");
		}
	}
}
  • KLASA "Swordsman"
public final class Swordsman extends Warrior
{
	public Swordsman(int level)
	{
		super(level, "Potężne uderzenie");
	}
}

Ten kod też nie jest zbyt interesujący. Przyjrzymy się logicznemu składaniu wszystkich modyfikatorów w całość dopiero pod koniec tego wielowątkowego tematu jakim jest dziedziczenie w języku Java. Na tę chwilę zwróćcie uwagę, że nowo dodana klasa "Swordsman" jest klasą finalną, zatem będzie traktowana jako najbardziej uszczegółowiona ze wszystkich etapów szkolenia się na wojownika. Można tworzyć wiele klas finalnych, aby dziedziczyły z tego samego "żebra". Na ten przykład ogólny "wojownik" może wejść na szczegółową klasę i stać się jeźdźcem konno ("Rider"), a drugi z nich może stać się zwinnym skrytobójcą ("Assassin") i też nie będzie sensu drążenia dalej tych klas, będzie zatem finalna.

Klasa finalna i dziedziczenie w języku Java

Słowo kluczowe "final" to znak dla kompilatora, aby zabronił dalszego dziedziczenia w oparciu o tę klasę.


Dziękuję za uwagę, następny fragment z cyklu dziedziczenia został już wydany.

PODOBNE ARTYKUŁY