07 - Ievads Objektorientētā Programmēšanā
Apgūstiet klašu un objektu pamatus Java.
Objektorientētā programmēšana (OOP) ir Java un Hytale modifikācijas pamats. Tā vietā, lai tikai mainīgie un metodes peldētu apkārt, mēs tos organizējam klasēs un objektos.
Kas ir Klase?
Klase ir objektu izveides plāns. Domā par to kā recepti vai paraugu.
public class Speletajs {
// Dati
String vards;
int dzivibas;
int limenis;
// Uzvedība (metode)
public void zaudetDzivibas(int bojajumi) {
dzivibas -= bojajumi;
System.out.println(vards + " saņēma " + bojajumi + " smagu triecienu!");
}
}Kas ir Objekts?
Objekts ir instance, kas izveidota no klases. Ja klase ir kā plāns, objekts ir rēalas lietas plānā
public class Main {
public static void main(String[] args) {
// Izveido objektu no Spēlētāja klases
Speletajs speletajs1 = new Speletajs();
speletajs1.vards = "Alice";
speletajs1.dzivibas = 100;
speletajs1.limenis = 5;
Speletajs speletajs2 = new Speletajs();
speletajs2.vards = "Bob";
speletajs2.dzivibas = 80;
speletajs2.limenis = 3;
// Izmanto objektus
player1.zaudetDzivibas(20); // Alice took 20 damage!
player2.zaudetDzivibas(15); // Bob took 15 damage!
}
}Klase = Plāns (iedomājies spēlētāju) Objekts = Reāla lieta (Alice, Bobs, specifiski spēlētāji)
Viena klase var izveidot vairākus objektus, tāpat kā viena recepte vairākas kūkas!
Vienkāršas Klases izveidošana
Pamēģinam izveidot Zobens klasi priekš Hytale:
public class Zobens {
// Īpašības
String nosaukums;
int sitienaSpeks;
int izturiba;
// Metode, lai izmantotu zobenu
public void sitiens(String merkis) {
System.out.println("Sitiens pret" + merkis + " veica " + sitienaSpeks + " bojājumus!");
izturiba -= 1;
if (izturiba <= 0) {
System.out.println(nosaukums + " salūza!");
}
}
// Metode, lai parādītu info
public void paraditInfo() {
System.out.println("Zobens: " + nosaukums);
System.out.println("Spēks: " + sitienaSpeks);
System.out.println("Izturība: " + izturiba);
}
}Klases izmantošana:
public class Main {
public static void main(String[] args) {
Zobens zobens = new Zobens();
zobens.nosaukums = "Dzelzs Zobens";
zobens.sitienaSpeks = 15;
zobens.izturiba = 3;
zobens.displayInfo();
zobens.uzbruk("Zombijs");
zobens.uzbruk("Skelets");
zobens.uzbruk("Zirneklis"); // Ar šo zobens salūzīs
}
}Konstruktori
Tā vietā, lai ievadītu īpašības vienu pa vienai, izmanto konstruktoru, lai inicializētu objektus:
public class Zobens {
String nosaukums;
int sitienaSpeks;
int izturiba;
// Konstruktors
public Zobens(String zobenaNosaukums, int zobenaSpeks, int zobenaIzturiba) {
nosaukums = zobenaNosaukums;
sitienaSpeks = zobenaSpeks;
izturiba = zobenaIzturiba;
}
public void uzbruk(String merkis) {
System.out.println("Sitiens pret " + merkis + " veica " + sitienaSpeks + " bojājumus!");
izturiba--;
}
}Tagad zobena izveidošana ir vieglāka:
public class Main {
public static void main(String[] args) {
// Daudz vienkāršāk
Zobens dzelzsZobens = new Zobens("Dzelzs Zobens", 15, 100);
Zobens dimantaZobens = new Zobens("Dimanta Zobens", 25, 200);
dzelzsZobens.uzbruk("Zombijs");
dimantaZobens.uzbruk("Boss");
}
}- Vienāds nosaukums ar klasi
- Nav atgriešanas tipa (pat ne
void) - Izsaukts automātiski, kad izmanto
new - Var būt vairāki konstruktori (pārlādēšana)
public class Prieksmets {
String nosaukums;
int vertiba;
// Konstrukcija ar visiem parametriem
public Prieksmets(String nosaukums, int vertiba) {
this.nosaukums = nosaukums;
this.vertiba = vertiba;
}
// Konstrukcija tikai ar nosaukumu
public Prieksmets(String nosaukums) {
this.nosaukums = nosaukums;
this.vertiba = 0; // Noklusējuma vērtība
}
}Kas ir this
this attiecas uz esošo objektu. Izmanto to, lai precizētu kad parametru nosaukumi sakrīt ar īpašības nosaukumu:
public class Speletajs {
String vards;
int veseliba;
public Speletajs(String vards, int veseliba) {
this.vards = vards; // this.vards = Īpašība
this.veseliba = veseliba; // name = Parametrs
}
}Bez this, Java apmulst:
public Speletajs(String vards, int veseliba) {
vards = vards; // ❌ Kurš vārds? Par plašu!
veseliba = veseliba; // ❌ Kāda veselība? Par plašu!
}Praktisks Piemērs
Priekšmeta Klase
public class Prieksmets {
String nosaukums;
String tips;
int daudzums;
double svars;
public Prieksmets(String nosaukums, String tips, int daudzums, double svars) {
this.nosaukums = nosaukums;
this.tips = tips;
this.daudzums = daudzums;
this.svars = svars;
}
public void izmantot() {
if (daudzums > 0) {
daudzums--;
System.out.println("Izmantoji " + nosaukums + ". Atlicis: " + daudzums);
} else {
System.out.println("Vairs " + nosaukums + " nav atlicis!");
}
}
public double dabutKopejoSvaru() {
return svars * daudzums;
}
}public class Main {
public static void main(String[] args) {
Item dzira = new Prieksmets("Veselības Dzira", "Lietojama", 5, 0.5);
potion.use(); // Izmantoja Veselības Dzira. Atlicis: 4
System.out.println("Kopējais svars " + dzira.dabutKopejoSvaru()); // 2.0
}
}Nezvēra Klase
public class Nezvers {
String nosakums;
int dzivibas;
int speks;
boolean irNaidigs;
public Nezvers(String vards, int dzivibas, int speks, boolean irNaidigs) {
this.vards = vards;
this.dzivibas = dzivibas;
this.speks = speks;
this.irNaidigs = irNaidigs;
}
public void zaudetDzivibas(int bojajumi) {
dzivibas -= bojajumi;
System.out.println(vards + " zaudēja " + bojajumi + " dzīvības!");
if (dzivibas <= 0) {
System.out.println(vards + " tika sakauts!");
} else {
System.out.println(vards + " vēl ir " + dzivibas + " atlikušas dzīvības.");
}
}
public int uzbrukSpeletajam() {
if (irNaidigs && dzivibas > 0) {
System.out.println(vards + " uzbruka ar " + speks + " punktiem!");
return speks;
}
return 0;
}
public boolean irDzivs() {
return dzivibas > 0;
}
}public class Main {
public static void main(String[] args) {
Nezvers zombijs = new Nezvers("Zombijs", 50, 10, true);
Nezvers vista = new Nezvers("Vista", 10, 0, false);
zombijs.zaudetDzivibas(20); // Zombijs saņim 20 punktu triecienu
int bojajumi = zombijs.uzbrukSpeletajam(); // Zombijs uzbrūk ar 10 punktu triecienu
if (zombijs.irDzivs()) {
System.out.println("Nezvērs vēl dzīvs!");
}
}
}Bloku Klase
public class Bloks {
String tips;
int x, y, z;
boolean irCiets;
int cietiba;
public Bloks(String tips, int x, int y, int z, boolean irCiets, int cietiba) {
this.tips = tips;
this.x = x;
this.y = y;
this.z = z;
this.irCiets = irCiets;
this.cietiba = cietiba;
}
public void sagrautBloku() {
System.out.println("Sagrauj " + tips + " bloku (" + x + ", " + y + ", " + z + ")");
System.out.println("Cik Ciets: " + cietiba);
}
public String dabutPoziciju() {
return "(" + x + ", " + y + ", " + z + ")";
}
public boolean varIzietCauri() {
return !irCiets;
}
}Piekļuves Modifikatori (priekšskatījums)
Esi redzējis public - tas nozīmē "jebkurš var piekļūt pie šī". Mēs noskaidrosim vairāk par piekļuves kontroli vēlāk, bet pagaidām pirmskats:
public class Example {
public String publicVar; // Anyone can access
private String privateVar; // Only this class can access
// (no modifier) String defaultVar; // Package access
}Pagaidām izmanto public visam. Iemācīsimies lietot private nākamajā sadaļā.
Klases palīdz:
- Organizēt saistītos datus un metodes kopā
- Atkārtoti izmantojiet kodu vienkārši (veido daudzus objektus no vienas klases)
- Modelēt iekš-pasaules lietas (spēlētāji, priekšmeti, monstri)
- Uzturēt kodu (izmaiņas vienuviet ietekmē visus objektus)
Bez klasēm, lai pārvaldītu 100 spēlētājus, katrai īpašībai būtu nepieciešami 100 atsevišķi mainīgie. Ar klasēm tie ir tikai 100 spēlētāju objekti.
Praktisks Vingrinājums
-
Izveido
dzirasKlasi:- Īpašības: vārds, dziedēšanas daudzums, lietošansa reizes
- Konstruktors, lai iestatītu visas īpašības
- Metode
dzert(), kas dziedina un samazina lietojumu - Metode 'irTukss()', kas atgriež true, ja lietošanas reizes mazāk vai vienādi ar 0
-
Izveido
LādeKlasi:- Īpašības: vai irSlēgta, priekšmetuSkaits, ietilpība
- Konstruktors
- Metode
pievienotPriekšmetu()kas arī pārbauda tilpumu - Metode
atslēgt()kas pārveidos irSlēgta par nepatiesu - Metode
irPilna()kas pārbauda vai priekšmetuSkaits >= ietilpības
-
Izveido
IedzīvotājsKlasi:- Īpašības: vārds, profesija, tirgošanāsReizes
- Konstruktors
- Metode
sveicinat()kas atbildēs ar sveicienu - Metode
tirgoties()kas palielinās tirgošanāsReizes - Metode
dabūtInfo()kas parādīs visas Īpašības
-
Izveido Vairākus Objektus: Izmantojot jebkuru no šīm klasēm, tagad izveido 3 dažādus objektus un pārbaudi visas metodes.