Classes Flashcards
Rekord - vlastnosti (3), co ma automaticky (5)
Vlastnosti: immutable, final (trida i fieldy), muze se anotovat (trida i fieldy)
konstruktor se vsemi parametry
accessory (gettery)
equals
hashCode
toString
Jak se v rekordu jmenuje getter pro promennou x
x()
Co je lokalni rekord
Rekord definovany uvnitr metody
(napr. pro ntici kvuli streamu)
Zapis rekordu s nazvem Point a fieldy x, y
Jeho instanciovani
Ziskani x
public record Point (int x, int y) {}
Point point = new Point(1, 2);
int x = point.x();
Zapis kanonicky konstruktor rekordu Point s fieldy x a y, obsahujici business logiku
public Point(int x, int y) {
// logika
this.x = x;
this.y = y;
}
Zapis kanonickeho kompaktniho konstruktoru rekordu Point s fieldy x a y, obsahujici business logiku
public Point {
// logika
}
fieldy se na konci priradi automaticky
UML diagram - zapis privatniho atributu a public metody
-atribut:typ
+metoda():typ
UML diagram - zapis dedicnosti a asociace (x obsahuje y)
dedicnost: sipka s dutym trojuhelnikem
asociace: kotova sipka s ozacenim poctu na kazde strane (0, 1, *)
Activity diagram - zapis eventu a vysledku
event: cerny puntik
vysledek: cerny puntik v kolecku
Activity diagram - zapis rozhodnuti a aktivity
rozhodnuti: piculka
aktivita: kulaty obdelnik
Sekvencni diagram - jak vypada
Kazdy objekt ma svou svislou lifeline
Obdelnik na care je zivot
Sipky mezi nimi jsou operace
Teckovana sipka je return
Co dela keyword new
Vytvori novou instanci objektu na heapu
Druhy promennych
Field - globalni promenna
Lokalni promenna - v bloku, nema modifikator pristupu
Type inference
Pro lokalni promenne lze pouzit var, pokud lze typ odvodit
Typ je maximalne konkretni, nemeni se
Konstanta - zapis + kdy se inicializuje
public static final NAME = …;
private final NAME = …;
final mohou byt i lokalni promenne a parametry
a. hned
b. pomoci vsech konstruktoru
c. pomoci inicializatoru
Staticky kontext
Class memory context
Je sdilen vsemi instancemi
Nelze v nem pouzit this
Lze volat z tridy i z instance
Staticky inicializator - syntaxe, kdy se vola
Poradi u dedicnosti
static {
staticVariable = “x”;
}
Jen jednou, pri loadu class
Object, Parent, Child
Inicializator, kdy se vola
Poradi u dedicnosti
{
field = “x”;
}
Pri vytvoreni instance jeste pred konstruktorem
Parent, Child (Object ho nema)
Syntax statickeho importu vseho ve tride
import static pkg.Class.*;
Immutable class (3)
+ priklady (3)
Fieldy jsou private, maji jen gettery
Pro zmenu parametru lze vratit repliku
Jsou thread safe
Wrappery, String, LocalDate
Pretizeni
Stejny nazev a navratovy typ, jine typy / pocet parametru
Nelze mit stejne jmeno a parametry, ale jiny navratovy typ!
Varargs + zapis
Vzdy posledni
Muzou byt hodnoty nebo jejich pole
public static void main(String… args) {
//values.length
//values[0]
}
Defaultni konstruktor
Bezparametricky
Vytvori se automaticky, ale jen pokud trida zadny nema
MyClass() { }
Vzajemne volani konstruktoru
Musi byt na prvnim radku konstruktoru - this(params);
Konstruktory nesmi cyklit
Enumeration - priklad syntaxe pro Temperature s hodnotami hot a cold
public enum Temperature {
HOT,
COLD; - strednik je nepovinny
}
Vlastnosti enumu (3)
Konstanty jsou public static final
Mohou mit instance variables / methods (musi se inicializovat konstruktorem)
Nelze vytvorit instanci, prepsat v nem tridu, implementovat v nem ifc
Syntax enumu Templerature: hot, cold s instance promennou message
public enum Temperature {
HOT(“hot”),
COLD(“cold”);
private String message;
private Temperature(String message) { this.message = message; }
public String getMessage() { return message; }
}
Enum metody
- ziskani prvni konstanty v enumu
- vraceni konstanty z hodnoty promenne “message”
MyEnum.values()[0]
MyEnum.valueOf(“message”)
Jak se predavaji parametry?
pres Stack
primitivni typy - hodnotou, puvodni promenna se nemeni, pri zmene se hodnota zkopiruje do nove promenne
objekty - referenci, v metode lze zmenit puvodni objekt
Parent kazde tridy + jeho metody (7)
Object
toString, equals, hashCode
clone
wait, notify, notifyAll
Rozsireni - klicove slovo
Kolik maximalne muze mit trida parentu a childu
extends
1 parenta
X childu
Subclass - dedicnost (3)
Jak vypadá v paměti
fieldy a metody:
- dedi vsechny
- k private nema pristup (ale existuji)
- muze pridavat / prepisovat
HEAP - je tam objekt s kodem childa i vsech jeho rodicu
Polymorfismus
Reference na child muze byt typu parent, potom vidim jen metody/fieldy parenta
ALE!!!! vzdy se pouzije prepsane telo metody z childa
Casting - kdy je a neni nutny
Priklad bezpecneho castovani (2)
Jak dopadne dotaz pro null?
Je nutny - z rodice na dite
Neni nutny - z ditete na rodice
if (a instanceof A.class)
{ A b = (A) a; }
if (a instanceof A.class aa)
{ /* A b = aa; */ }
null instanceof Object.class == false
hashCode metoda
hashCode metoda pro vice objektu
vraci pro stejne objekty (dle equals) stejne cislo
Objects.hash(obj, obj, obj)
Klicova slova pro tuto a parenti instanci
Povinnost
this, super
Nepovinne, pokud jde videt, o co jde
Prepsani metody - zmena access prav
Child muze rozsirit access
protected -> public
Jediny zpusob, kdy prepisuji metodu a pritom se pouzije kod parenta
Zavolat v prepsane metode
super.metoda();
Jinak ji zabiju
Konstruktory v subclass
Child konstruktory nededi.
Kontruktor musi na zacatku volat konstruktor parenta (super(params)) nebo jiny, ktery ho vola.
Pokud ma parent bezparametricky konstruktor, vola se implicitne (super() se nemusi psat).
Typicky priklad equals
public boolean equals(Object o) {
if (o == this) return true;
if (!o instanceof MyClass) return false;
MyClass m = (MyClass) o;
// compare fields
}
Abstraktni trida - popis
Abstraktni metoda - popis
Syntax
Trida: Nelze vytvorit instanci, obsahuje aspon 1 abstraktni metodu (muze obsahovat i normalni metody a fieldy)
Metoda: Nema telo, child musi vsechny prepsat
public abstract class MyClass {
public abstract void method();
}
Final class/method
Z class nelze dedit
Metodu nelze prepsat
Sealed class/ifc - co to je
Podminky pro subclass (3)
Rozhoduje, kdo ho smi rozsirit/implementovat
Subclass:
* ve stejnem modulu (pro unnamed modul ve stejnem pkg)
* primo rozsiruje tridu
* obsahuje modifikator pro sealing (final, sealed, non-sealed)
Sealed class + jeji subclass: syntax
public sealed class MyClass permits MyChild {}
public non-sealed class MyChild extends MyClass {}
…permits je vzdy az na konci…
Genericka trida - syntax, instancializovani
Jak se rika “te veci”?
Kde jeste lze pouzit?
public class MyClass<T> {
private T field;
public T method() { ... }
}
new MyClass<String>();</String></T>
Typova promenna
V ifc
Typova promenna - konvence pismenek
T type
K key, V value
Co je raw type
Nepouziti genericu
Napr. List list misto List<String> list</String>
Co je natural order
Trida ma metodu compareTo
Metoda compareTo pro razeni dle jmena
public int compareTo(Clazz other) {
return this.getName().compareTo(other.getName());
}
Metoda compareTo pro inty
public int compareTo(Integer other) {
return this-other;
}
var k = System.out::println
Zkompiluje?
Ne, nezna typ, ktery vstupuje do funkce
enum MyEnum { HOT, COLD }
Jak ziskam MyEnum.HOT ze Stringu “HOT”?
MyEnum.valueOf(“HOT”);
Jaky access modifikator muze mit enum konstruktor?
private, default (package-protected)
Muze rekord extendovat tridu / implementovat ifc?
Extendovat nesmi (uz extenduje java.lang.Record), implementovat ano
Jake fieldy jsou povoleny na rekordu?
Je povolen instance initializer?
staticke: ano
member: pouze private final
neni
Mam tridu Record v package pkg.a i v pkg.b.
Ktera se pouzije?
import pkg.a.*;
import pkg.b.Record;
Ta z becka (wildcard ma nizsi prioritu)
Mam tridu Record v package pkg.a i v pkg.b.
Ktera se pouzije?
import pkg.a.*;
import pkg.b.Record;
Ta z becka (wildcard ma nizsi prioritu)
A a = (B) b;
uz pri kompilaci vim, ze to nejde pretypovat.
co se stane?
kompilace ok, vyjimka se vyhodi za behu