[PL] Wstęp do programowania w Javie dla kompletnych laików #5 - pierwsze świadome stworzenie i użycie klasy

in polish •  7 years ago 

Witajcie, 

w tym poście postaram się wam pokazać jak stworzyć klasę z pewnymi metodami i utworzyć obiekt reprezentujący naszą klasę.

Zacznijmy od zastanowienia się co nasza klasa ma robić. Załóżmy, że chcemy aby obiekt klasy był wstanie zapamiętać w pamięci obecną liczbę na jakiej wykonywać będziemy operacje i potrzebujemy metody, która pozwoli nam na wykonywaniu pewnych matematycznych działań.

Aby stworzyć nową klasę kliknij prawym klawiszem na naszego package'a (to ten po lewej co wygląda w stylu pl.grzegorz2047.helloworld) i przesuń myszkę na "New", i kliknij "Java Class". Jako nazwę dajmy na przykład MathCountingMaster, czyli powiedzmy, że klasa jest naszym mistrzem w liczeniu czegoś.

No dobra,  nasza klasa powinna wyglądać tak:

public class MathCountingMaster {
}

Dodajmy teraz sobie zmienną, która  będzie w klasie, ale poza metodą! Jaka jest różnica?

 No główną różnicą jest to, że dane zapisane w naszej zmiennej(kontenerze na daną), nie zostaną usunięte wraz z końcem działania metody, tylko dopiero z końcem życia naszego obiektu. Czyli innymi słowy, zmienna poza metodą żyję od powstania obiektu do zakończenia jego działania. Zakończenie jego działania zależy od miejsca, w którym obiekt został stworzony. Jeżeli został on stworzony w jakieś metodzie, która wykonuje się krótko, to po zakończeniu działania metody, Java próbuje usunąć z pamięci nie używane obiekty, chyba, że przekażemy obiekt gdzieś dalej.

Zmienną, która jest w klasie, ale poza metodą nazywamy polem(field). Tworzenie pola jest identyczne z tworzeniem zwykłej zmiennej.

Stworzenie takiego pola wygląda tak:

public class MathCountingMaster {
   
   private double currentNumber = 0;
   
}

Zdefiniowaliśmy właśnie pole, które jest prywatne, przechowuje typ liczb zmienno przecinkowych(czyli takich, które mają coś po kropce np. 1.25 albo 1.55555) i ma przypisaną liczbę 0.

Co zmienia, że pole ma widoczność prywatną? No to znaczy identycznie jak w przypadku metod. Czyli jak jest prywatna(private), to pole jest widoczne tylko w obrębie klasy, jeżeli widoczność jest chroniona (protected), to zmienna jest widoczna także dla "dzieci" dziedziczących funkcjonalności klasy. No i widoczność publiczna(public), czyli do zmiennej może się każdy dostać, który poprosi o to obiekt naszej klasy. Więcej informacji znajdziesz np. tutaj: https://stackoverflow.com/questions/215497/in-java-difference-between-package-private-public-protected-and-private

To teraz zdefiniujmy metodę, która będzie wykonywała pewne operacje matematyczne:

public class MathCountingMaster {

   private double currentNumber = 0;

   public void doMathOperation(String operation, double number) {
       if (operation.equals("+")) {
           currentNumber += number;
       } else if (operation.equals("-")) {
           currentNumber -= number;
       } else if (operation.equals("/")) {
           if (number == 0) {
               System.
out.println("Panie, nie mozesz dzielic przez zero!");
               return;
           }
           currentNumber /= number;
       } else if (operation.equals("*")) {
           currentNumber *= number;
       } else {
           System.
out.println("Nie rozpoznano działania!");
       }
   }
}

Zastanówmy się teraz, co się właśnie tutaj pojawiło. widzimy jakieś if, jakieś else if, jakieś elese, jakieś equals, oraz takie znaczki jak += -= /= *= , no i jeszcze double.

Zacznijmy od tego if. Możemy if przetłumaczyć jako "jeśli". Jest to konstrukcja, która oczekuje pewne wyrażenie logiczne, które w przypadku bycia prawdziwym wykona instrukcje pomiędzy if(wyrażenie){ }

A jak powiedzieć w przeciwnym razie? A to mamy,  mamy takie określenie jak else. Te słowo kluczowe zawsze jest po if. Słowo else nie jest wymagane, ale czasem chcemy wykonać coś w przeciwnym wypadku.

Jest jeszcze możliwość użycia słowa kluczowego else if, które można przetłumaczyć jako "albo"

Przykładowa takiego ifa  wygląda np. tak:

if (a == b) {

//Wykonaj pewne instrukcje

} else if (a > b) {

//Wykona operacje, gdy a jest większe od b

} else {

//Wykonaj wszystkie inne instrukcje, czyli a nie jest równe b oraz a nie jest większe od b

}

Wyrażenie a == b, mówi, że zawartość zmiennej a jest porównywana z zawartością zmiennej b. Jeżeli zawartości są identyczne, to //Wykonaj pewne instrukcje

W przypadku porównywania napisów musimy użyć metody equals(), która sprawdza czy rzeczywiście napisy są identyczne. Metodę możemy wywołać np poprzez:

"Jakiś napis".equals("Inny napis") ; //To zwróci false (fałsz)

lub można tak:

String zmienna = "napis";

zmienna.equals("napis");// to zwróci true (prawda) 

Jeżeli nie są równe, to //Wykonaj inne instrukcje

Inne możliwe wyrażenia na przykładzie dwóch zmiennych a i b, to:

  • a != b     czyli zawartość a jest różna od b
  • !a     czyli nie prawda, że zawartość (Pamiętajmy, że zmienne mogą przechowywać "prawda"(true) albo "fałsz"(false))
  • a >= b    zmienna a większa lub równa zmiennej b 
  • a <= b    zmienna a mniejsza lub równa zmiennej b
  • a > b  zmienna a większa od zmiennej b
  • a < b  zmienna a mniejsza od zmiennej b

Pamiętajcie, że używam tu skrótu myślowego, ponieważ zmienna nie może być większa, tylko zawartość zmiennej może być większa itd.

Więcej informacji związanej z if na stronie: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html

Więcej informacji związanej z wyrażeniami na stronie: http://codingbat.com/doc/java-if-boolean-logic.html

Wracając do pozostałych pytań. Co to są te znaczki += -= /= *= ?

  • +=  - ten znaczek to taki skrót myślowy, czyli do zmiennej po lewej stronie dodaj coś co jest po prawej stronie. 

 Np:

zmienna += 5;//do zmiennej dodaj liczbe 5

ale

zmienna = zmienna + 5;//Robi to samo, czyli do zmiennej weź przypisz aktualną wartość powiększoną o 5

I tak samo z resztą znaczków.

  • -= - odejmuje coś od zmiennej
  • /=  dzieli przez coś naszą zmienną
  • *= mnoży naszą zmienną przez coś

Są jeszcze operacje bitowe, ale o nich nie będę tutaj mówić. Dowiecie się o nich kiedyś xd

Dobra, a co to jest ten double?

Double to jest typ zmiennej, która związana jest z liczbami od podwójnej precyzji, czyli takiej, która może posiadać wiele liczb po kropce np. 5.333333333333333 albo 692342.32230420340234234234234234

To wyjaśniłem wam co to są te dziwne słowa i znaczki, to teraz przejdźmy do omówienia kodu.

 W naszej klasie MathCountingMaster posiadamy pole currentNumber, które początkowo ma liczbę zero i to pole akceptuje liczby zmienno przecinkowe(4.534343, albo 3.3232 itd.)

W klasie jest metoda doMathOperation, która posiada dwa argumenty początkowe. Pierwszym z nich, to zmienna typu String, czyli taka co przechowuje jakiś napis. Drugi parametr, to zmienna typu double przechowująca liczbę zmienną przecinkową.

To do czego są te ify. Dosłowne znaczenie ich to jeżeli zmienna z parametru o nazwie operation posiada napis równy "+", to ma dodać liczbę, którą metoda otrzymała jako drugi parametr startowy, no i analogicznie tak dla pozostałych ifów. Natomiast else, mówi, że w przeciwnym razie (czyli jeżeli żaden z ifów nie został uznany za "prawdziwy") ma wypisać "Nie rozpoznano działania" na konsoli.

Można też zauważyć, że w środku ifa związanego z dzielenie jest następny if. On sprawdza czy podana liczba w drugim parametrze metody nie jest równa zero. Bo jak dzielimy przez zero, to wystąpi błąd.

No i widzimy tam też takie coś jak return;. To oznaczy tylko tyle, że nie chcemy aby dalej ta metoda się wykonywała. Taka instrukcja jest tylko możliwa, jeżeli nasza metoda zwraca typ void, czyli nie zwraca żadnej wartości.

No okej, to mamy naszą klasę z naszą metodą, to teraz trzeba stworzyć obiekt reprezentujący stworzoną klasę. Zróbmy to w metodzie głównej main.

Usuńmy teraz wszystko w głównej klasie oprócz naszej konstrukcji metody. A następnie utwórzmy obiekt. A potem wykonajmy jakąś operację:

public class Main {

   public static void main(String[] args) {
       MathCountingMaster obiekt = new MathCountingMaster();
       obiekt.doMathOperation("+", 5);
   }
}

Taki protip, nie mieszajcie angielskiego z językiem polskim tak jak to ja robię w tym przypadku. Jedynym powodem tego jest próba pokazania wam co to zmienna a co obiekt itd.

Powyższy kod mówi:

Zadeklaruj zmienną typu MathCountingMaster o nazwie "obiekt" i przypisz do niego instancję klasy(obiekt). Następnie odwołaj się do zmiennej przechowującej obiekt i użyj metodę doMathOperation z parametrami "+" i 5

Fajnie spoko, tylko co się stanie po uruchomieniu programu? 

Nic.

Dlaczego? 

Ponieważ wykonaliśmy pewne działanie, ale nigdy nie dowiedzieliśmy się jaka jest aktualna liczba ani nie wyświetliliśmy tej liczby na ekranie. W takim razie jak odwołać się do zmiennej przechowującej obecną liczbę w klasie MathCountingMaster

Napiszmy metodę w klasie MathCountingMaster, która będzie udostępniała nam wartość tej zmiennej.

Coś w tym stylu:

public class MathCountingMaster {

   private double currentNumber = 0;

   public void doMathOperation(String operation, double number) {
       if (operation.equals("+")) {
           currentNumber += number;
       } else if (operation.equals("-")) {
           currentNumber /= number;
       } else if (operation.equals("/")) {
           if (number == 0) {
               System.
out.println("Panie, nie mozesz dzielic przez zero!");
               return;
           }
           currentNumber /= number;
       } else if (operation.equals("*")) {
           currentNumber *= number;
       } else {
           System.
out.println("Nie rozpoznano działania!");
       }
   }

   public double getCurrentNumber() {
       return currentNumber;
   }
}

Jak widzicie stworzyłem metodę publiczną(czyli widoczną dla wszystkich) zwracająca typ zmiennej double, o nazwie getCurrentNumber, a jej instrukcja to dosłownie "zwróć zmienną o nazwie currentNumber"

To teraz użyjmy tę metodę w metodzie main, aby odczytać nową wartość po wykonaniu operacji "+" dla liczby 5.  Zwrócona liczba powinna wynieść 5, bo 0 + 5 = 5

Nasza klasa główna powinna wyglądać tak:

public class Main {

   public static void main(String[] args) {
       MathCountingMaster obiekt = new MathCountingMaster();
       obiekt.doMathOperation("+", 5);
       double nowaLiczbaPoOperacji = obiekt.getCurrentNumber();
       System.
out.println(nowaLiczbaPoOperacji);
   }
}

Opisując w skrócie działanie całej metody main:

Stwórz obiekt klasy MathCountingMaster, wykonaj metodę doMatchOperation dla zmiennej obiekt, pobierz nową wartość przechowywowaną w zmiennej obiekt, wyświetl nową liczbę na ekranie.

Uruchom swoją aplikację i zobacz jaki jest wynik. Zastanów się dlaczego akurat tak on wygląda a nie inaczej oraz spróbuj wykonać inne operacje z innymi liczbami. Zobacz także jaka będzie nowa wartość po wykonaniu nowych operacji. 

Powodzenia!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!