7. Lekce - objekty a třídy

Objekty

Objekty jsou celky, které seskupují data a metody, které pracují s těmito daty. Často můžou reprezentovat objekty z reálného světa, jako auta, osoby, zboží v obchodě nebo části, jakési komponety, které usnadní vytvoření složitějšího programu. Příkladem mohly být například sprajty z kurců  na code.org. Jiným typickým příkladem těchto objektou jsou například tlačítka, textová pole, tabulky a podobně z uživatelského rozhraní aplikace.

Třída

Zatím co objekty jsou konkrétní reprezentace. Jako například moje auto červená Dacia nebo tlačítko s popiskem "Start" v horní části okna nebo osoba david ježek, zaměstnána na VŠB a narozena v prosinci už hodně dávno :-)

Třídy reprezentují šablonu, popis toho jak daný objek má vypadat, jaké data (datový typ a název) má obsahovat jaké jsou metody, které tyto data umí používat.

Třída je pak v jazyce Java také datovým typem. Pokud tedy budeme mít třídu Person, můžeme vytvořit proměnnou david  a do ní uložit nový objekt, vytvořený ze třídy Person, který bude mít informace o osobě David Ježek.

Ukázka třídy

package cz.vsb.kp;

import java.time.LocalDate;
import java.time.Period;

public class Person {

private String name;
private String lastName;
private LocalDate dayOfBirth;
private long salary;

public Person(String name, String lastName, LocalDate dayOfBirth) {
super();
this.name = name;
this.lastName = lastName;
this.dayOfBirth = dayOfBirth;
}

public long getSalary() {
return salary;
}

public void setSalary(long salary) {
this.salary = salary;
}

public String getName() {
return name;
}

public String getLastName() {
return lastName;
}

public LocalDate getDayOfBirth() {
return dayOfBirth;
}

public long age() {
LocalDate today = LocalDate.now();
return Period.between(dayOfBirth, today).toTotalMonths() / 12;
}

@Override
public String toString() {
return "Person [name=" + name + ", lastName=" + lastName + ", dayOfBirth=" + dayOfBirth + ", salary=" + salary
+ "]";
}

}

Objekt - ukázka vytvoření a použití

Random r = new Random();
int randomYear = 1989 + r.nextInt(30);
int randomMonth = 1 + r.nextInt(12);
int randomDay = 1 + r.nextInt(28);

Person david = new Person("David", "Ježek", LocalDate.of(randomYear, randomMonth, randomDay));

System.out.println(david.toString());
System.out.println("Věk je " + david.age());

david.setSalary(1000000);
System.out.println(david.toString());

Třídy viditelnost public vs. private

Jednotlivé metody a třídní a instanční proměnné mohou mít nastavenu takzvanou viditelnost. Prozatím použijeme jen dvě možnosti a to public a private. Viditelnost public je určena pro metody a proměnné, ke kterým může přistupovat kdokoliv (kterýkoliv kód i mimo danou třídu). Jedná se tedy o veřejně dostupné metody a proměnné. Naopak metody a proměnné označené jako private (privátní) jsou přístupné jen z kódu dané třídy.

Můžeme tak oddělit pomocné metody určenné jen k "vnitřnímu" použití uvnitř dané přídy a na medoty poskytované všem ostatním, které umožní "komunikaci" a využití dané třídy ostatním třídám.

Často se pro proměnné používá viditelnost private aby jejich použití bylo řízeno jen danou třídou. Pak taky existují veřejné metody takzvané gettry a settry, které umožňují nastavovat hodnoty těchto  proměnných. Tyto metody pak mohou obsahovat další k například k ověření podmínek zda nová hodnota proměnné splňuje požadovaný rozsah.

Třídy - modifikátor static

Dalším modifikátorem využitelným pro metody a proměnné je static. Takto nesou označenní proměnné a metody, které jsou společné pro všechny objekty dané třídy.

Mnohdy se static používá například u společných proměnných, nebo konstant jejihž hodnota je sdílena všemi třídami.

Pokud je pužit modifikátor static u metody, jedná se o metodu, která nemůže využívat proměnné, které nejsou označeny static. Často se tak jedná o obecné metody mnohdy označené taky jako public, které se mohou využívat bez nutnsti vytvoření objektu dané třídy.

My jsme zatím hojně využívaly metody s modifikátorem static, ale to není zrovna typický případ, naopak většina metod není označena jako static a pracují především s nestatickými proměnnými dané třídy.
 

Třídy - this

Uvnitř třídy v metodách, které nejsou static můžeme používat klíčové slovo this (tento). Lze použít na jednoznačné určení, že používáme proměnnou nebo metodu tohoto objektu se kterým právě pracujeme.

Většinou this nemusíme používat. pokud kompilátor uvnit ku třídy narazí na volání metody nebo použití proměnné s názvem, který odpovádá nějaké metodě nebo proměnné dané třídy je jasné, že prokramátor chtěl použít metody a třídy daného objektu a klíčové slovo this se doplní automatocky.

Většinou se this používá v případě že parametr metody má stejný název jako proměnné ve třídě, pak this určuje zda se má pracovat s proměnnou třídy (respektive objektu) nebo s parametrem metody. Mnohdy parametr metody slouží ktomu aby se upravila hodnota proměnné třídy (instanční proměnné), proto aby byl jasný význam proměnné jako například lastName a nemuseli jsme používat napříkald modifikaci lastName1 využívá se k rozpoznání proměnné a parametru právě this.

Rozšíření třídy Person

package cz.vsb.kp;

import java.time.LocalDate;
import java.time.Period;
import java.util.Random;

public class Person {

public static long MINIMAL_SALARY = 5000;

private String name;
private String lastName;
private LocalDate dayOfBirth;
private long salary;

public Person(String name, String lastName, LocalDate dayOfBirth) {
super();
this.name = name;
this.lastName = lastName;
this.dayOfBirth = dayOfBirth;
}

public long getSalary() {
return salary;
}

public void setSalary(long salary) {
if (salary < MINIMAL_SALARY) {
this.salary = MINIMAL_SALARY;
} else {
this.salary = salary;
}
}

public String getName() {
return name;
}

public String getLastName() {
return lastName;
}

public LocalDate getDayOfBirth() {
return dayOfBirth;
}

public long age() {
LocalDate today = LocalDate.now();
return Period.between(dayOfBirth, today).toTotalMonths() / 12;
}

@Override
public String toString() {
return "Person [name=" + name + ", lastName=" + lastName + ", dayOfBirth=" + dayOfBirth + ", salary=" + salary
+ "]";
}

public static void main(String[] args) {
Random r = new Random();
int randomYear = 1989 + r.nextInt(30);
int randomMonth = 1 + r.nextInt(12);
int randomDay = 1 + r.nextInt(28);
Person david = new Person("David", "Ježek", LocalDate.of(randomYear, randomMonth, randomDay));
System.out.println(david.toString());
System.out.println("Věk je " + david.age());
david.setSalary(1000000);
System.out.println(david.toString());
david.setSalary(2000);
System.out.println(david.toString());
}

}

Seznam jmen as příjmení

	private static List<String> jmena = Arrays.asList("Petr", "Marie", "Jan", "Jana", "Tomáš", "Kateřina", "Lukáš",
"Tereza", "Martin", "Veronika", "David", "Eva", "Jakub", "Lucie", "Michal", "Anna", "Adam", "Monika", "Tom",
"Klára", "Robert", "Kristýna", "Marek", "Simona", "Filip", "Petra", "Ondřej", "Lenka", "Matěj", "Markéta",
"Pavel", "Hana", "Jakub", "Adéla", "Daniel", "Barbora", "Lukáš", "Eliška", "Josef");

private static List<String> prijmeni = Arrays.asList("Novák", "Svoboda", "Novotný", "Dvořák", "Černý",
"Procházková", "Kučera", "Veselý", "Horák", "Němec", "Pokorný", "Mareš", "Pospíšilová", "Hájek", "Jelínek",
"Král", "Růžička", "Beneš", "Fiala", "Sedláček", "Kříž", "Němcová", "Vlček", "Kolář", "Bartoš", "Bílý",
"Veselá", "Kovařík", "Havelka", "Malý", "Urban", "Kopecký", "Vlach", "Šimek", "Konečný", "Doležal",
"Šťastný", "Kopečná", "Holub", "Pospíchal");


Random r = new Random();
jmena.get(r.nextInt(jmena.size()));
prijmeni.get(r.nextInt(prijmeni.size()));