b'\n_START_ARTICLE_\nKlasa (programowanie obiektowe)\n_START_PARAGRAPH_\nKlasa \xe2\x80\x93 cz\xc4\x99\xc5\x9bciowa lub ca\xc5\x82kowita definicja dla obiekt\xc3\xb3w. Definicja obejmuje dopuszczalny stan obiekt\xc3\xb3w oraz ich zachowania. Obiekt, kt\xc3\xb3ry zosta\xc5\x82 stworzony na podstawie danej klasy nazywany jest jej instancj\xc4\x85. Klasy mog\xc4\x85 by\xc4\x87 typami j\xc4\x99zyka programowania \xe2\x80\x93 przyk\xc5\x82adowo, instancja klasy Owoc b\xc4\x99dzie mie\xc4\x87 typ Owoc. Klasy posiadaj\xc4\x85 zar\xc3\xb3wno interfejs, jak i struktur\xc4\x99. Interfejs opisuje, jak komunikowa\xc4\x87 si\xc4\x99 z jej instancjami za po\xc5\x9brednictwem metod, za\xc5\x9b struktura definiuje spos\xc3\xb3b mapowania stanu obiektu na elementarne atrybuty. _NEWLINE_Zale\xc5\xbcnie od implementacji, klasy mog\xc4\x85 istnie\xc4\x87 w programie tylko na etapie jego kompilacji, w wyniku kt\xc3\xb3rej s\xc4\x85 t\xc5\x82umaczone na kod strukturalny lub te\xc5\xbc posiada\xc4\x87 swoj\xc4\x85 reprezentacj\xc4\x99 w kodzie wynikowym w postaci metaobiekt\xc3\xb3w. Za ich pomoc\xc4\x85 program mo\xc5\xbce odczytywa\xc4\x87 i manipulowa\xc4\x87 informacjami o klasie podczas wykonywania._NEWLINE_J\xc4\x99zyki programowania implementuj\xc4\x85ce klasy r\xc3\xb3\xc5\xbcni\xc4\x85 si\xc4\x99 pod wzgl\xc4\x99dem oferowanej funkcjonalno\xc5\x9bci. Wi\xc4\x99kszo\xc5\x9b\xc4\x87 z nich wspiera r\xc3\xb3\xc5\xbcne formy dziedziczenia oraz hermetyzacji.\n_START_SECTION_\nZagadnienia\n_START_PARAGRAPH_\nZ poj\xc4\x99ciem klasy zwi\xc4\x85zanych jest wiele dodatkowych zagadnie\xc5\x84 oraz funkcjonalno\xc5\x9bci, kt\xc3\xb3re s\xc4\x85 implementowane w j\xc4\x99zykach programowania.\n_START_SECTION_\nStruktura\n_START_PARAGRAPH_\nOpr\xc3\xb3cz interfejsu, klasa definiuje tak\xc5\xbce struktur\xc4\x99 danych przechowywanych w obiektach. S\xc4\x85 one dzielone na elementarne atrybuty, zwane tak\xc5\xbce polami lub w\xc5\x82a\xc5\x9bciwo\xc5\x9bciami. Zbi\xc3\xb3r warto\xc5\x9bci wszystkich atrybut\xc3\xb3w tworzy stan konkretnego obiektu, kt\xc3\xb3ry przechowywany jest w pami\xc4\x99ci lub innym no\xc5\x9bniku danych pod okre\xc5\x9blonym adresem, dzi\xc4\x99ki czemu mo\xc5\xbcliwy jest dost\xc4\x99p do niego za po\xc5\x9brednictwem referencji._NEWLINE_W wi\xc4\x99kszo\xc5\x9bci j\xc4\x99zyk\xc3\xb3w programowania struktura pami\xc4\x99ci wykorzystywanej do przechowywania stanu obiektu jest ustalana w momencie kompilacji programu na podstawie definicji klasy oraz w\xc5\x82a\xc5\x9bciwo\xc5\x9bci architektury sprz\xc4\x99towej. Alternatywnym podej\xc5\x9bciem jest model j\xc4\x99zyka Python, w kt\xc3\xb3rym warto\xc5\x9bci atrybut\xc3\xb3w obiektu s\xc4\x85 zapisane jako tablica asocjacyjna par (klucz, warto\xc5\x9b\xc4\x87). Dzi\xc4\x99ki temu poszczeg\xc3\xb3lne obiekty tej samej klasy mog\xc4\x85 r\xc3\xb3\xc5\xbcni\xc4\x87 si\xc4\x99 ilo\xc5\x9bci\xc4\x85 i znaczeniem atrybut\xc3\xb3w, kt\xc3\xb3re mog\xc4\x85 by\xc4\x87 do nich dynamicznie dodawane._NEWLINE_Klasy definiuj\xc4\x85 r\xc3\xb3wnie\xc5\xbc zbi\xc3\xb3r niezmiennik\xc3\xb3w, kt\xc3\xb3re s\xc4\x85 zachowywane przez wszystkie metody klasy. Niezmiennik jest pewnym wyra\xc5\xbceniem odnosz\xc4\x85cym si\xc4\x99 do atrybutu, kt\xc3\xb3re musi by\xc4\x87 zawsze spe\xc5\x82nione aby stan obiektu by\xc5\x82 prawid\xc5\x82owy, niezale\xc5\xbcnie od tego, jakie operacje na nim wykonamy. Je\xc5\x9bli przy pomocy obiekt\xc3\xb3w reprezentujemy r\xc3\xb3\xc5\xbcne samochody, mo\xc5\xbcemy zdefiniowa\xc4\x87 niezmiennik definiuj\xc4\x85cy minimalny promie\xc5\x84 skr\xc4\x99tu. Programista nie mo\xc5\xbce utworzy\xc4\x87 obiektu samochodu, kt\xc3\xb3rego warto\xc5\x9b\xc4\x87 promienia skr\xc4\x99tu b\xc4\x99dzie mniejsza, ni\xc5\xbc minimalna, a gwarantuje nam to obecno\xc5\x9b\xc4\x87 niezmiennika. Niezmienniki mog\xc4\x85 by\xc4\x87 implementowane poprzez zabronienie bezpo\xc5\x9bredniego dost\xc4\x99pu do atrybut\xc3\xb3w obiektu i utworzenie dodatkowych metod dost\xc4\x99powych, kt\xc3\xb3re opr\xc3\xb3cz ich ustawiania, sprawdzaj\xc4\x85 tak\xc5\xbce niezmienniki. W niekt\xc3\xb3rych j\xc4\x99zykach niezmienniki mo\xc5\xbcna definiowa\xc4\x87 bezpo\xc5\x9brednio jako cz\xc4\x99\xc5\x9b\xc4\x87 specyfikacji klasy.\n_START_SECTION_\nElementy statyczne\n_START_PARAGRAPH_\nCz\xc4\x99\xc5\x9b\xc4\x87 j\xc4\x99zyk\xc3\xb3w dopuszcza tworzenie tzw. metod oraz atrybut\xc3\xb3w statycznych. Nie s\xc4\x85 one zwi\xc4\x85zane z \xc5\xbcadnym konkretnym obiektem klasy, lecz tworz\xc4\x85 globalny stan oraz globalnie dost\xc4\x99pne operacje, kt\xc3\xb3re mo\xc5\xbcna wywo\xc5\x82ywa\xc4\x87 nawet wtedy, gdy nie posiadamy \xc5\xbcadnej instancji klasy.\n_START_SECTION_\nRodzaje klas\n_START_PARAGRAPH_\nIstnieje wiele rodzaj\xc3\xb3w klas r\xc3\xb3\xc5\xbcni\xc4\x85cych si\xc4\x99 w\xc5\x82a\xc5\x9bciwo\xc5\x9bciami i zastosowaniami. Nale\xc5\xbcy zauwa\xc5\xbcy\xc4\x87, \xc5\xbce poni\xc5\xbcsze rodzaje nie s\xc4\x85 roz\xc5\x82\xc4\x85czne. Przyk\xc5\x82adowo, poniewa\xc5\xbc nie mo\xc5\xbce istnie\xc4\x87 klasa, kt\xc3\xb3ra jest jednocze\xc5\x9bnie finalna i abstrakcyjna, mo\xc5\xbcna wnioskowa\xc4\x87, \xc5\xbce klasy finalne s\xc4\x85 szczeg\xc3\xb3lnym przypadkiem klas w\xc5\x82a\xc5\x9bciwych.\n_START_SECTION_\nKlasy w\xc5\x82a\xc5\x9bciwe\n_START_PARAGRAPH_\nKlas\xc4\x85 w\xc5\x82a\xc5\x9bciw\xc4\x85 nazywamy ka\xc5\xbcd\xc4\x85 klas\xc4\x99, kt\xc3\xb3ra mo\xc5\xbce by\xc4\x87 instancjonowana.\n_START_SECTION_\nKlasy finalne\n_START_PARAGRAPH_\nKlasa finalna ma sens jedynie w przypadku dziedziczenia \xe2\x80\x93 nazywamy tak klas\xc4\x99, kt\xc3\xb3rej nie mo\xc5\xbcna rozszerzy\xc4\x87.\n_START_SECTION_\nKlasy lokalne i wewn\xc4\x99trzne\n_START_PARAGRAPH_\nNiekt\xc3\xb3re j\xc4\x99zyki programowania umo\xc5\xbcliwiaj\xc4\x85 tworzenie klas w innych przestrzeniach, ni\xc5\xbc globalna. Istnieje kilka typ\xc3\xb3w takich klas._NEWLINE_Klasa wewn\xc4\x99trzna lub zagnie\xc5\xbcd\xc5\xbcona to klasa, kt\xc3\xb3ra jest zdefiniowana wewn\xc4\x85trz innej klasy. Klasy wewn\xc4\x99trzne posiadaj\xc4\x85 dost\xc4\x99p do metod statycznych klasy g\xc5\x82\xc3\xb3wnej, lecz nie musz\xc4\x85 by\xc4\x87 instancjonowane wraz z ni\xc4\x85. Zale\xc5\xbcnie od j\xc4\x99zyka, mog\xc4\x85, ale nie musz\xc4\x85 by\xc4\x87 dost\xc4\x99pne spoza klasy g\xc5\x82\xc3\xb3wnej._NEWLINE_Klasy lokalne mog\xc4\x85 by\xc4\x87 tworzone wewn\xc4\x85trz funkcji i metod. Obiekty tych klas nie mog\xc4\x85 istnie\xc4\x87 poza tymi funkcjami i s\xc4\x85 niszczone wraz z zako\xc5\x84czeniem ich wykonywania. J\xc4\x99zyk programowania mo\xc5\xbce ponadto narzuca\xc4\x87 dodatkowe ograniczenia na takie klasy.\n_START_SECTION_\nKlasy anonimowe\n_START_PARAGRAPH_\nW wi\xc4\x99kszo\xc5\x9bci j\xc4\x99zyk\xc3\xb3w programowania ka\xc5\xbcda klasa posiada sw\xc4\x85 unikaln\xc4\x85 nazw\xc4\x99, dzi\xc4\x99ki czemu mo\xc5\xbcliwe jest odwo\xc5\x82ywanie si\xc4\x99 do niej w r\xc3\xb3\xc5\xbcnych sytuacjach. Niekt\xc3\xb3re j\xc4\x99zyki wspieraj\xc4\x85 tak\xc5\xbce tworzenie klas anonimowych, kt\xc3\xb3re nie posiadaj\xc4\x85 nazwy.\n_START_SECTION_\nKlasy cz\xc4\x99\xc5\x9bciowe\n_START_PARAGRAPH_\nW przeciwie\xc5\x84stwie do zwyk\xc5\x82ych klas, definicja klasy cz\xc4\x99\xc5\x9bciowej mo\xc5\xbce by\xc4\x87 rozszerzona na wi\xc4\x99cej, ni\xc5\xbc jeden plik. Umo\xc5\xbcliwia to lepsze radzenie sobie z du\xc5\xbcymi ilo\xc5\x9bciami kodu. Podczas kompilacji wszystkie cz\xc4\x99\xc5\x9bciowe definicje \xc5\x82\xc4\x85czone s\xc4\x85 w kompletn\xc4\x85 klas\xc4\x99, dzi\xc4\x99ki czemu nie ma \xc5\xbcadnych funkcjonalnych r\xc3\xb3\xc5\xbcnic mi\xc4\x99dzy nimi a zwyk\xc5\x82ymi klasami.\n_START_SECTION_\nPrzyk\xc5\x82ad\n_START_PARAGRAPH_\nPrzyk\xc5\x82ad klasy w j\xc4\x99zyku Java:_NEWLINE_public class Samochod {_NEWLINE__NEWLINE_    private int predkoscMax;_NEWLINE_    private String producent;_NEWLINE_    private String model;_NEWLINE_    private int predkosc;_NEWLINE__NEWLINE_    public Samochod(String producent, String model, int predkoscMax) {_NEWLINE_        this.predkoscMax = predkoscMax > 0 ? predkoscMax : 0;_NEWLINE_        this.producent = producent != null ? producent : "nieznany";_NEWLINE_        this.model = model != null ? model : "model";_NEWLINE_        this.predkosc = 0;_NEWLINE_    }_NEWLINE__NEWLINE_    public void przyspiesz(int i) {_NEWLINE_        int nowaPredkosc = this.predkosc + i;_NEWLINE_        this.predkosc = nowaPredkosc < this.predkoscMax ? nowaPredkosc : this.predkoscMax;_NEWLINE_    }_NEWLINE__NEWLINE_    public void zwolnij(int i) {_NEWLINE_        int nowaPredkosc = this.predkosc - i;_NEWLINE_        this.predkosc = nowaPredkosc > 0 ? nowaPredkosc : 0;_NEWLINE_    }_NEWLINE__NEWLINE_    public int aktualnaPredkosc() {_NEWLINE_        return this.predkosc;_NEWLINE_    }_NEWLINE__NEWLINE_    public String toString() {_NEWLINE_        return this.producent + " " + this.model;_NEWLINE_    }}'