Na początek, chciałbym Was serdecznie przeprosić za dość długi czas nieobecności, wynikało to po prostu z nawału różnych spraw które zwaliły mi się na raz na głowę.
Zaczynajmy więc, dzisiaj zaczniemy od kontynuacji poprzedniego tematu - tj. konstruktorów. Do czego służą, i jak się ich używa już wiecie, kto nie wie, zapraszam do drugiej części. Przypomnę ogólną deklarację konstruktora domyślnego:
Jeśli nie zdeklarujemy konstruktora domyślnego, nic się nie stanie. Po prostu zostanie dodany przez JVM. Deklarując taki konstruktor, przesłaniamy konstruktor domyślny. Oznacza to, że ten który jest przez JVM dodawany, przestaje funkcjonować, a w jego miesce wskakuje ten zadeklarowany przez nas, i to właśnie działania określone w nim zostaną przeprowadzone. Pola oczywiście inicjowane są w.g zasad określonych w poprzedniej lekcji. Jednak aby tak się stało muszą zostać spełnione pewne warunki:public class Klasa{
int pole1;
int pole2;
String pole3;
// Tutaj konstruktor:
Klasa(){
//to jest konstruktor domyślny, możemy tutaj przeprowadzić jakieś operacje
}
}
-Konstruktor musi być bezparametrowy - czyli postaci Konstruktor()
-Konstruktor o jednej postaci może być tylko jeden - o tym kawałek dalej, na ten moment przyjmijcie, że konstruktor postaci Konstruktor() możecie zdeklarować tylko raz.
Konstruktor może też przyjmować parametry, jak kazda inna metoda. Różni się jednak od zwyczajnej metody tym, że wywołując go, tworzymy nowy obiekt, podczas gdy zwyczajna metoda jest wywoływana z istniejącego juz obiektu.
Poniżej przykłady:
Mamy tutaj dwa różne konstruktory. Po czym poznać że są to konstruktory a nie zwykłe metody? Po tym, że nazywają się tak samo jak klasa. Jeśli jakaś metoda nazywa się tak samo jak klasa, uwzględniając wielkość liter, to automatycznie staje się ona konstruktorem. Mamy tutaj dwa konstruktory. Jeden nie przyjmuje żadnych parametrów, drugi przyjmuje trzy. Możemy więc stworzyć obiekt na dwa różne sposoby. Stworzyć z domyślną inicjalizacją pól (patrz roz. 2), lub stworzyć podając do konstruktora parametry. Te przekazane parametry mogą postłużyć do zainicjalizowania pól. Nie jest to jednak zasada, oczywiście możemy z tymi parametrami zrobić co sobie życzymy. Możemy nawet wcale nic z nimi nie robić. Poniżej przykłady użycia.public class Klasa{
int pole1;
int pole2;
String pole3;
// Tutaj konstruktor domyślny:
Klasa(){
//jakieś operacje
}
Klasa(int param1, int param2, String param3){
//to jest konstruktor z parametrami
}
}
Zdefiniujmy od razu działanie drugiego konstruktora:Klasa klasa = new Klasa(); // konstruktor bez parametrów
Klasa klasa = new Klasa(1,2,"jakiś tekst"); //konstruktor z parametrami
Powyżej wywołania. Co się dzieje z polami obiektów przy wywoływaniu tych dwóch konstrutorów? Pokazuję i obiaśniam:public class Klasa{
int pole1;
int pole2;
String pole3;
Klasa(int param1,int param2,String param3){
pole1=param1;
pole2=param2;
pole3=param3;
}
}
Konstruktor bez parametrów :
pole1=0 (int)
pole2=0 (int)
pole3="" (String)
Konstruktor z parametrami:
pole1=1
pole2=2
pole3="jakiś tekst"
Konstruktorów z parametrami możemy mieć dowolną ilość, jednak muszą różnić się pewnymi cechami. Mogą robić dokładnie to samo, diabeł jak zwykle tkwi w szczegółach. Otóż muszą one różnić się parametrami. Możecie mieć konstruktory o różnej liczbie parametrów. Możecie też mieć dwa konstruktory o takiej samej ilości parametrów. Parametry w takim wypadku muszą mieć różne typy. Nazwy mogą mieć różne, to nie ma znaczenia.
Tak jest ok:
tak też jest ok:Klasa(int param1, int param2){
//cośtam
}
Klasa(int param1, int param2,int param3){
//cośtam
}
Ale tak już nie jest dobrze:Klasa(int param1, int param2){
//cośtam
}
Klasa(int param1, String param2){
//cośtam
}
Dlaczego? Jeśli zachcielibyście wywołać taki konstruktor ( stworzyć przy jego pomocy obiekt ) to z kąd JVM miałoby wiedzieć którego konstruktora użyć?Klasa(int param1, int param2){
//cośtam
}
//tak być nie może! konstruktory mają te same typy parametrów!
Klasa(int param3, int param4){
//cośtam
}
Mam nadzieję, że to wam przejaśni nieco istotę działania konstruktorów. Ze względu na ograniczenie ilości znaków w poście, dalsza część będzie dostępna w następnym poście.