Motivace
V tomto kurzu se budeme zabývat Objektově oritentovaným programováním (OOP) pouze intuitivně. Přesněji a podrobněji se OOP věnuje kurz Paradigmata programování 3.
Jako motivační příklad si vezměme například system vozidlo v zavodní hře. Všechna vozidla sdílí některé vlastnosti jako je počet kol, volant, apod. Liší se například výkonem motoru, barvou karoserie. Těmto vlastnostem budeme říkat atributy.
Kromě atributů mohou vozidla vykonávat různé akce jako zrychlit, zpomalit, zabrzdit, atd.
Výše uvedené požadavky lze splnit i pomocí procedurálního programování. Lepším řešením je ale použít tzv Objekty. Objekt je část programu, která sdružuje vlastnosti nějaké entity (v našem případě auta) a umožňuje s touto entitou provádět akce (zrychlit, zpomalit). Akce budeme nazývat metody.
OOP v Javě
Pokud chceme pracovat s objekty, tak jako první musíme vyrvořit šablonu, která nám řekne jake vlastnosti daný objekt má a jaké může provádět akce. Šablonu nazýváme třída a definujeme ji následovně:
class Car {
/**
* Vyrobce vozidla
*/
String manufacturer;
/**
* Statni poznavaci znacka
*/
String licensePlateNumber;
/**
* Barva vozidla
*/
String color;
/**
* Aktualni rychlost
*/
int speed = 0;
/**
* Vykon motoru. Atribut neni mozne menit.
*/
final int power;
/**
* Konstruktor
*/
Car(String manufacturer, String licensePlateNumber, String color, int speed, int power) {
this.manufacturer = manufacturer;
this.licensePlateNumber = licensePlateNumber;
this.color = color;
this.speed = speed;
this.power = power;
}
/**
* Metoda pro zmenu barvy
*/
void changeColor(String color) {
this.color = color;
}
/**
* Zrychleni
*/
boolean speedUp(int speed){
this.speed += speed;
return true;
}
/**
* Zpomaleni
*/
boolean slowDown(int speed) {
this.speed -= speed;
return true;
}
/**
* Metoda pro prevod objektu na retezec
*/
@Override
public String toString() {
return manufacturer + " " + licensePlateNumber;
}
}
Práce s objekty
Před tím, než začneme pracovat s objektem v Javě (i v jiných jazycích), musíme
jej nejdříve vytvořit. To se v Javě děla pomocí klíčového slova new
.
Takto vytvořenému objektu říkáme instance třídy.
// Vytvoreni instance
Car fordFocus = new Car("Ford",
"1M1 1234",
"Red",
134);
// Pristup k atributum (jen pro 2. seminar!!!)
System.out.println(fordFocus.licensePlateNumber);
// Volani metody
fordFocus.changeColor("Yellow");
boolean speedUp = fordFocus.speedUp(20);
Řetezce
Ve výše uvedeném příkladu se vyskytl datový typ String
.
Jedná se o třídu reprezentující řetezce. Třída nabízí celou škálu metod pro práci
řetezci. Více se lze dočíst v
dokumentaci.
Pozor String
není to samé jako char[]
!
Pro převod objektu na textový řetezec se používa metoda toString()
, kterou je
potřeba nejdříve implementovat.
Příklad práce s řetezci
// Vytvoreni retezce
String name = "Johny English";
// Textovy blok
String longText = """
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Nullam feugiat, turpis at pulvinar vulputate,
erat libero tristique tellus, nec bibendum odio risus
sit amet ante. Etiam sapien elit, consequat eget,
tristique non, venenatis quis, ante. Mauris metus.""";
// Vytvoreni retezce z pole znaku
char[] greetingArray = { 'h', 'e', 'l', 'l', 'o', '.' };
String greetingString = new String(greetingArray);
// Vypis na obrazovku
System.out.println(longText);
// Delka retezce
int length = greetingString.length();
// Ziskani znaku na indexu 2
char letter = longText.charAt(2);
Spojování řetězců
U řetězců v Javě nelze měnit hodnoty. Pokud chceme do řetezce přidat nějaký znak, tak musíme vytvořit nový. To je ale značne neefektivní proto exituje třída StringBuilder která tento neduh odstraňuje.
Spojování pomocí concat a +
String firstName = "Luke";
String lastName = "Skywalker";
String fullName;
// Metoda concat spoji 2 retezce a vytvori novy
fullName = firstName.concat(lastName);
// Metoda lze zavolat i na literaly
fullName = "Luke".concat("Skywalker");
// Lze pouzit i operaci +
fullName = "Luke" + lastName;
Třída StringBuilder
Níže jsou uvedeny nejčastěji používané metody. Pro kompletní výčet odkazuji na dokumentaci.
// Vytvoreni StringBuilder
StringBuilder stringBuilder = new StringBuilder();
StringBuilder stringBuilderWithCapacity = new StringBuilder(30);
StringBuilder stringBuilderWithString = new StringBuilder("Hello");
// Delka
int length = stringBuilderWithString.length();
// Pripojeni retezce na konec
stringBuilderWithString.append("Luke Skywalker.");
// Vlozeni retezce na dany index
stringBuilderWithString.insert(5, ", I am jedi master ");
// Nahrazeni casti retezce
stringBuilderWithString.replace(12, 23, "Jedi Master");
// Vymazani casti retezce
stringBuilderWithString.delete(12, 24);
// Znak na danem indexu
char letter = stringBuilderWithString.charAt(2);
// Podretezec
String substringFrom = stringBuilderWithString.substring(12);
String substringFromTo = stringBuilderWithString.substring(12, 16);
Pole
Stejně jako jazyk C i jazyk Java umožňuje vytvářet pole hodnot.
Vytvoření pole
// Deklarace pole
String[] cars;
// Deklarace pole s hodnotami
String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
// Vytvoreni "prazdneho" pole pro 10 prvku
int[] numbers = new int[10];
Přístup k prvkům pole
Práce s poli se neliší o jazyka C.
// Pristup k prvku
System.out.println(cars[0]);
// Nastaveni prvku pole
cars[1] = "Škoda";
Délka pole
Jazyk Java poskytuje atribut length který nám vrátí délku pole.
// Vypis delky pole
System.out.println(cars.length);
Iterace přes prvky pole
// Iterace pres indexy
for (int i = 0; i < cars.length; i++) {
System.out.println(cars[i]);
}
// Iterace pres prvky
for (String car : cars) {
System.out.println(car);
}
Třída Arrays
V Javě máme k dispozici třídu Arrays. Ve které jsou implementovány nejčastěji používané oprace s poli. Níže je malá ukázka (podrobněji viz dokumentace).
String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
// Vyhleda dany prvek v poli a vrati jeho index.
// V pripade neuspechu vraci zapornou hodnotu.
Arrays.binarySearch(cars, "Mazda");
// Prevede pole na retezec
Arrays.toString(cars);
// Setridi pole
Arrays.sort(cars);
// Porovna lexikograficky dve pole a vraci hodnotu:
// 0 - Pokud jsou stejna
// mensi nez 0 - Pokud je prvni pole mensi (lexikograficky) nez druhe
// vetsi nez 0 - V ostatnich pripadech
Arrays.compare(cars, new String[] {"Mazda", "BMW"});
Úkoly
Úkoly mi neposílejte, budou zkontrolovány na dalším semináři.
Třídě Index definujte metodu print(), která vypíše (efektivním způsobem!) obsah rejstříku ve formátu:
Rejstřík{ Osoba{id=0, jméno=Prokop, příjmení=Dveře, telefon=+420555444333} Osoba{id=1, jméno=Tomáš, příjmení=Putna, telefon=+420999888777} Osoba{id=2, jméno=Fero, příjmení=Dunaj, telefon=+421123456789} Osoba{id=3, jméno=Johnny, příjmení=Cash, telefon=+1987654321} Osoba{id=4, jméno=Tomáš, příjmení=Putna, telefon=111222333} } a ukončí řádek.