Klasy i obiekty - co to jest

 

Klasa to definicja / opis grupy obiektów o takich samych cechach (atrybutach) i funkcjach (metodach). Możemy powiedzieć, że klasa to szablon, który określa cechy i funkcje obiektów określonego typu. Słowo "klasa" jest w rzeczywistości synonimem słowa "typ". Obiekt określonego typu/klasy ma określone parametry (cechy, atrybuty) oraz może realizować określone funkcje (metody).

Ale w programie obiektowym w Javie klasa jako "szablon" obiektów jest już sama w sobie istniejącym bytem - strukturą, z której możemy skorzystać, jeśli są w niej dostępne tzw. elementy (atrybuty i metody) klasy - elementy statyczne. Patrz Statyczne i niestatyczne elementy klasy (static vs. non-static).

Czyli jeśli mamy klasę i utworzymy obiekt tej klasy, to w rzeczywistości mamy już do dyspozycji w programie dwa elementy - dwie struktury:

  • klasę jako strukturę szablonu z dostępnymi atrybutami statycznymi i metodami statycznymi,
  • obiekt tej klasy utworzony zgodnie z tym szablonem, w którym mamy dodatkowo dostęp do atrybutów niestatycznych i metod niestatycznych (atrybutów i metod obiektu), przy czym w obiekcie dostępne są także wszystkie elementy statyczne.

Pokazano to na przykładzie dostępnym niżej (patrz Przykład pokazujący klasę jako strukturę "szablonu" dla obiektów niezależną od obiektów tej klasy.).

 

Obiekt danej klasy to konkretny, realny egzemplarz danego typu/klasy, utworzony za pomocą specjalnej metody - konstruktora (patrz Konstruktor obiektów danej klasy).

Każdy egzemplarz danej klasy / danego typu - obiekt - jest zgodny z szablonem, który stanowi definicja klasy.

 

W Javie nazwy klas zaczynamy od wielkiej litery.

 

Jeśli zdefiniujemy klasę bez żadnych elementów, wówczas domyślnie zostanie utworzona dla takiej klasy jedna metoda - tzw. pusty konstruktor.

 

Następująca definicja klasy...

class MojaKlasa {
} 

...jest równoważna definicji pokazanej niżej, w której występuje jedna metoda - pusty konstruktor służący do tworzenia obiektów danej klasy:

class MojaKlasa {
    MojaKlasa() {
    }
} 

Zauważ, że nazwa metody - konstruktora jest identyczna z nazwą klasy, czyli zaczyna się od wielkiej litery, chociaż zwyczajowo nazwy wszystkich metod w Javie rozpoczynamy małą literą. Konstruktor jest wyjątkowym typem metody.

Pusty, domyślny konstruktor jest generowany wyłącznie wówczas, gdy w definicji klasy nie ma żadnego konstruktora.

Zadaniem domyślnego konstruktora jest wywołanie bezargumentowego konstrutora klasy nadrzędnej - klasy, z której dana klasa jest odziedziczona. W najprostrzym przypadku jest to klasa java.lang.Object.

 

Obiekty danej klasy to konkretne wystąpienia (instancje) tej klasy.

Nazwy atrybutów, zmiennych i metod w Javie zaczynamy zwyczajowo od małej litery.

 

Przykład definicji klasy z jednym atrybutem i dwiema metodami. Możesz też samodzielnie zdefiniować własny konstruktor lub nawet kilka różnych konstruktorów.

class Coin {
    int value;    // atrybut 

    int getValue() {    // metoda, która zwraca wartość typu int
        return value;
    }    
    
    void displayValue() {    // metoda, która nie zwraca żadnej wartości lecz wyświetla wartość atrybutu value
        System.out.println( value );    
    }
}

 

Przykład definicji klasy ze zdefiniowanymi dwoma konstruktorami:

class Coin {
    int value;    // atrybut 
    
    Coin() {    // konstruktor domyślny - metoda bez parametrów
        value = 1;    // domyślnie ustaw wartość monety na 1
    }    
    
    Coin( int coinValue ) {    // konstruktor z parametrem
        value = coinValue;    // ustaw wartość monety na coinValue
    }    
}

Zwróć uwagę na fakt, że w wypadku metody - konstruktora nie określamy zwracanego typu. Wpisanie kodu void Coin() wygeneruje błąd kompilacji.

 

Jeśli nie przeczytałeś dotychczas sekcji Języki programowania → Klasyfikacja języków ze względu na paradygmat programowania → Języki obiektowe, zajrzyj tam koniecznie teraz - kliknij następujący odsyłacz: Języki obiektowe.

 

Żeby program mógł zadziałać, w głównej klasie programu musi być zdefiniowana metoda o nazwie main zadeklarowana w specyficzny sposób. Metoda main powinna wystąpić tylko w jednej - głównej klasie. Niżej pokazana jest definicja klasy Coin, którą można skompilować i uruchomić.

1. Zapisz plik z podanym niżej kodem pod nazwą Coin.java

2. Skompiluj w wierszu poleceń (javac Coin.java).

3. Uruchom w wierszu poleceń (java Coin).

W programie tym zostaną utworzone dwa obiekty klasy Coin, a następnie zostanie wywołana metoda displayValue() każdego z tych obiektów.

class Coin {
    int value;    // atrybut 

    //KONSTRUKTORY:

    Coin() {    // konstruktor domyślny - metoda bez parametrów
        value = 1;    // domyślnie ustaw wartość monety na 1
    }    
    
    Coin( int coinValue ) {    // konstruktor z parametrem
        value = coinValue;    // ustaw wartość monety na coinValue
    }    

    //ZWYKŁE METODY KLASY:

    int getValue() {    // metoda, która zwraca wartość typu int
        return value;    // zwróć wartość monety
    }    
    
    void displayValue() {    // metoda, która nie zwraca żadnej wartości lecz wyświetla wartość atrybutu value
        System.out.println( value );    // wyświetl wartość monety
    }

    //METODA URUCHAMIAJĄCA PROGRAM:

    public static void main( String[] a ) {
        Coin coinA = new Coin();	// utwórz obiekt klasy Coin przy użyciu konstruktora bez parametrów
        Coin coinB = new Coin( 5 );	// utwórz obiekt klasy Coin przy użyciu konstruktora z parametrem

        coinA.displayValue();	// w konsoli zosatnie wyświetlona wartość 1
        coinB.displayValue();
    }    

}

 

 

Przykład pokazujący klasę jako strukturę "szablonu" dla obiektów niezależną od obiektów tej klasy. Klasa ClassA jako struktura jest dostępna natychmiast po uruchomieniu programu, zanim tworzony jest pierwszy obiekt tej klasy - obiect1. Ponadto natychmiast dostępne są wszystkie statyczne elementy tej klasy

//TEN PROGRAM MUSI BYĆ ZAPISANY W PLIKU ClassAsAutonomousStructure_Program.java
//NALEŻY GO SKOMPILOWAĆ PRZY UŻYCIU POLECENIA javac ClassAsAutonomousStructure_Program.java
//NALEŻY GO URUCHOMIĆ PRZY UŻYCIU POLECENIA java ClassAsAutonomousStructure_Program


class ClassA {        // klasa z dwoma atrybutami statycznymi i jednym niestatycznym
	static int staticAttribute;	

	static int getStaticAttribute() {
		return getStaticAttribute;
	}

	int attribute;
}


class ClassAsAutonomousStructure_Program {
	public static void main( String[] args ) {
		ClassA.staticAttribute = 100;
		//ClassA.attribute = 2; 	// ERROR - attempt to acces non-static element from static context
		
		System.out.println( "ClassA.staticAttribute: " + ClassA.staticAttribute );	// static field accessible in the class ClassA before the object of this class is created
		System.out.println( "ClassA.getStaticAttribute(): " + ClassA.getStaticAttribute() );	// static method accessible in the class ClassA before the object of this class is created

		ClassA obiect1 = new ClassA();
		obiect1.attribute = 1;
		obiect1.staticAttribute++;		// static field is accessible also through the instantiated object of class ClassA 
		System.out.println( "obiect1.attribute: " + obiect1.attribute );
		System.out.println( "obiect1.staticAttribute: " + obiect1.staticAttribute );		
		System.out.println( "ClassA.staticAttribute: " + ClassA.staticAttribute );	

		ClassA obiect2 = new ClassA();
		obiect2.attribute = 3;
		obiect2.staticAttribute++;		
		System.out.println( "obiect2.attribute: " + obiect2.attribute );
		System.out.println( "obiect2.staticAttribute: " + obiect2.staticAttribute );				
		System.out.println( "ClassA.staticAttribute: " + ClassA.staticAttribute );		// here you can see that the static field ClassA.staticAttribute is associated 
																						// actually with the class and NOT with any object of this class
	}
}

 

 

____________________________________________________________________________________________________________