Programovanie

Ako ukladať údaje do objektov Java

Posledná aktualizácia: január 2020

Aj keď je tlačidlo odloženia spánku pravdepodobne najbežnejšie používaným tlačidlom na budíku, je dokonca jednoduché Budík trieda potrebuje ešte niekoľko funkcií. Môžete napríklad chcieť skontrolovať, ako dlho zostane budík v režime opakovaného budenia. Ak chcete pridať takúto funkciu, musíte pochopiť, ako Java ovláda údaje.

Vývojári používajú premenné v Jave na uchovávanie údajov, pričom všetky premenné majú dátový typ a názov. Údajový typ určuje hodnoty, ktoré môže obsahovať premenná. V tomto tutoriáli sa dozviete, ako integrálne typy obsahujú celé čísla, typy s pohyblivou rádovou čiarkou skutočné čísla a typy reťazcov reťazce znakov. Potom začnete používať inštančné premenné vo svojich triedach Java.

Premenné a primitívne typy

Volal primitívne typy, typy s integrálnou a pohyblivou rádovou čiarkou sú najjednoduchšie typy údajov v Jave. Nasledujúci program ilustruje integrálny typ, ktorý môže obsahovať kladné aj záporné celé čísla. Tento program tiež ilustruje komentáre, ktoré dokumentujú váš kód, ale nijako ho neovplyvňujú.

/ * * Toto je tiež komentár. Kompilátor ignoruje všetko od * prvého / * po „hviezdičku“, ktorá končí komentár. * * Tu je "hviezdička", ktorá končí komentár. * / public class IntegerTest {public static void main (String [] args) {// Tu je deklarácia premennej typu int s názvom anInteger, // ktorej počiatočná hodnota je 100. int anInteger = 100; // Deklarovať a inicializovať anInteger System.out.println (anInteger); // Výstupy 100 // Aritmetiku môžete robiť aj s primitívnymi typmi pomocou // štandardných aritmetických operátorov. anInteger = 100 + 100; System.out.println (anInteger); // výstupy 200}} 

Java tiež používa typy s pohyblivou rádovou čiarkou, ktoré môžu obsahovať reálne čísla, to znamená čísla, ktoré obsahujú desatinné miesto. Tu je príklad programu:

public class DoubleTest {public static void main (String [] args) {// Tu je deklarácia dvojitej premennej s názvom aDouble. // Tiež dáte aDouble počiatočnú hodnotu 5,76. double aDouble = 5,76; // Deklarovať a inicializovať aDouble System.out.println (aDouble); // Výstupy 5,76 // Aritmetiku môžete robiť aj s typmi pohyblivej rádovej čiarky. aDouble = 5,76 + 1,45; System.out.println (aDouble); // Výstupy 7,21}} 

Skúste spustiť programy uvedené vyššie. Nezabudnite, že skôr ako ich spustíte, musíte ich skompilovať:

javac * .java java IntegerTest java DoubleTest 

Java používa štyri integrálne typy a dva typy s pohyblivou rádovou čiarkou, ktoré oba obsahujú rôzne rozsahy čísel a zaberajú rôzne množstvo úložného priestoru, ako je uvedené v tabuľkách nižšie.

Integrálne typy

TYPByteKrátkyIntDlhé
SIZE (bity)8163264
ROZSAH-128 až 127-32 768 až 32 767-2 147 483 648 až 2 147 483 647-263 až 263-1

Typy s pohyblivou rádovou čiarkou (formát IEEE 754)

 
TYPPlná desatinná čiarka s jednou presnosťouDvojitá presnosť s pohyblivou rádovou čiarkou
SIZE (bity)3264
ROZSAH+/- 1,18x10-38 až +/- 3,4x1038+/- 2,23x10-308 až +/- 1,8x10308

A typ struny drží reťazce a narába s nimi odlišne od spôsobu, akým typy s integrálnou a pohyblivou rádovou čiarkou narábajú s číslami. Medzi jazyk Java patrí a String trieda, ktorá predstavuje reťazce. Reťazec deklarujete pomocou typu Stringa inicializujte ho úvodzovkou s úvodzovkami, postupnosťou znakov obsiahnutých v dvojitých úvodzovkách, ako je uvedené nižšie. Môžete tiež kombinovať dva reťazce pomocou + operátor.

// Fragment kódu // Deklarácia premenných s typu String, // a inicializácia s citovaným reťazcom „Hello“. Reťazec s = "Dobrý deň"; // Zreťazenie reťazca s s citovaným reťazcom „World“ Reťazec t = s + „World“; System.out.println (t); // Výstupy Ahoj svet

Variabilný rozsah

Okrem typu, rozsah je tiež dôležitou charakteristikou premennej. Rozsah určuje, kedy je premenná vytvorená a zničená a kde má vývojár prístup k premennej v rámci programu. Miesto vo vašom programe, kde deklarujete premennú, určuje jej rozsah.

Doteraz som diskutoval lokálne premenné, ktoré obsahujú dočasné údaje, ktoré používate v rámci metódy. V metódach deklarujete lokálne premenné a máte k nim prístup iba z týchto metód. To znamená, že môžete načítať iba lokálne premenné anInteger, ktoré ste použili v IntegerTesta aDouble, ktoré ste použili v DoubleTest, z hlavnej metódy, v ktorej boli deklarované, a nikde inde.

Lokálne premenné môžete deklarovať v rámci ľubovoľnej metódy. Nasledujúci príkladový kód deklaruje lokálnu premennú v Odloženie budíka AlarmClock () metóda:

verejná trieda AlarmClock {public void snooze () {// Čas odloženia v milisekundách = 5 s dlhá snoozeInterval = 5000; System.out.println ("ZZZZZ pre:" + snoozeInterval); }} 

Môžete sa dostať k snoozeInterval iba z odložiť () metóda, ktorú ste deklarovali snoozeInterval, ako je zobrazené tu:

public class AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); aClock.snooze (); // Toto je stále v poriadku. // Ďalší riadok kódu je CHYBA. // K metóde snoozeInterval nemáte prístup mimo metódy snooze. snoozeInterval = 10 000; }} 

Parametre metódy

A parameter metódy, ktorý má rozsah podobný miestnej premennej, je ďalším typom premennej. Parametre metódy odovzdávajú argumenty do metód. Keď deklarujete metódu, zadáte jej argumenty v zozname parametrov. Keď zavoláte metódu, predáte argumenty. Parametre metódy fungujú podobne ako miestne premenné v tom, že spadajú do rozsahu metódy, s ktorou sú spojené, a dajú sa použiť v celej metóde. Na rozdiel od miestnych premenných však parametre metódy získavajú hodnotu od volajúceho, keď volá metódu. Tu je modifikácia budíka, ktorá vám umožní vstúpiť do snoozeInterval.

verejná trieda AlarmClock {public void snooze (long snoozeInterval) {System.out.println ("ZZZZZ pre:" + snoozeInterval); }} 
public class AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); // Keď zavoláte metódu, zadajte interval opakovaného budenia. aClock.snooze (10 000); // Odloženie na 10 000 ms. }} 

Členské premenné: Ako objekty ukladajú údaje

Lokálne premenné sú užitočné, ale pretože poskytujú iba dočasné úložisko, ich hodnota je obmedzená. Pretože ich životnosť pokrýva celú dĺžku metódy, v ktorej sú deklarované, miestne premenné sa porovnávajú s poznámkovým blokom, ktorý sa objaví vždy, keď dostanete telefónny hovor, ale zmizne, keď zložíte. Toto nastavenie môže byť užitočné na zaznamenávanie poznámok, ale niekedy potrebujete niečo trvalejšie. Čo má robiť programátor? Zadajte členské premenné.

Členské premenné - z toho sú dve, inštancia a statický - tvoria súčasť triedy.

Variabilný rozsah a životnosť

Vývojári implementujú premenné inštancie tak, aby obsahovali údaje užitočné pre triedu. Premenná inštancie sa od lokálnej premennej líši svojou povahou rozsahu a životnosti. Celá trieda tvorí rozsah premennej inštancie, nie metódu, v ktorej bola deklarovaná. Inými slovami, vývojári majú prístup k premenným inštancií kdekoľvek v triede. Okrem toho životnosť inštančnej premennej nezávisí od žiadnej konkrétnej metódy triedy; to znamená, že jeho životnosť je životnosť inštancie, ktorá ho obsahuje.

Inštancie sú skutočné objekty, ktoré vytvoríte z plánu, ktorý navrhnete v definícii triedy. V deklarácii triedy deklarujete premenné inštancie, ktoré majú vplyv na každú inštanciu, ktorú vytvoríte z podrobného plánu. Každá inštancia obsahuje tieto premenné inštancie a údaje uchovávané v premenných sa môžu líšiť od inštancie k inštancii.

Zvážte Budík trieda. Prechádzajúce snoozeInterval do odložiť () metóda nie je vynikajúci dizajn. Predstavte si, že na budíku musíte zadávať interval odloženia vždy, keď ste hľadali tlačidlo odloženia. Namiesto toho stačí dať celému budíku a snoozeInterval. Toto doplníte inštančnou premennou v Budík triedy, ako je uvedené nižšie:

verejná trieda AlarmClock {// Tu deklarujete snoozeInterval. Toto z neho robí inštančnú premennú. // Tiež to tu inicializujete. dlhé m_snoozeInterval = 5 000; // Čas odloženia v milisekundách = 5 s. public void snooze () {// Do m_snoozeInterval sa stále môžete dostať metódou AlarmClock //, pretože ste v rozsahu triedy. System.out.println ("ZZZZZ pre:" + m_snoozeInterval); }} 

K premenným inštancií máte prístup takmer kdekoľvek v rámci triedy, ktorá ich deklaruje. Aby ste boli technicky zdatní, deklarujete inštančnú premennú v rámci rozsah triedya môžete ich získať takmer odkiaľkoľvek v tomto rozsahu. Prakticky vzaté, k premennej máte prístup kdekoľvek medzi prvou zloženou zátvorkou, ktorá začína triedu, a záverečnou zátvorkou. Pretože tiež deklarujete metódy v rozsahu triedy, môžu tiež pristupovať k premenným inštancie.

K premenným inštancie môžete pristupovať aj mimo triedy, pokiaľ existuje, a máte premennú, ktorá odkazuje na inštanciu. Na získanie premennej inštancie prostredníctvom inštancie použijete bodkový operátor spolu s inštanciou. To nemusí byť ideálny spôsob prístupu k premennej, ale zatiaľ ju pre ilustráciu doplňte takto:

verejná trieda AlarmClockTest {public static void main (String [] args) {// Vytvorte dva hodiny. Každý z nich má svoje vlastné m_snoozeInterval AlarmClock aClock1 = nový AlarmClock (); AlarmClock aClock2 = nový AlarmClock (); // Zmena aClock2 // Čoskoro uvidíte, že existujú oveľa lepšie spôsoby, ako to urobiť. aClock2.m_snoozeInterval = 10 000; aClock1.snooze (); // Odloženie s intervalom aClock1 aClock2.snooze (); // Odloženie s intervalom aClock2}} 

Vyskúšajte tento program a uvidíte, že aClock1 stále má svoj interval 5 000 while aClock2 má interval 10 000. Každá inštancia má opäť svoje vlastné inštančné údaje.

Nezabudnite, že definícia triedy je iba podrobný plán, takže premenné inštancie v skutočnosti neexistujú, kým nevytvoríte inštancie z podrobného plánu. Každá inštancia triedy má svoju vlastnú kópiu premenných inštancie a podrobný plán definuje, čo tieto premenné inštancie budú.

JavaWorld

Zapuzdrenie

Zapuzdrenie je jedným zo základov objektovo orientovaného programovania. Pri použití zapuzdrenia používateľ interaguje s typom prostredníctvom exponovaného správania, nie priamo s internou implementáciou. Prostredníctvom zapuzdrenia skryjete podrobnosti o implementácii typu. V Jave sa zapuzdrenie v zásade prekladá do tohto jednoduchého pravidla: „Nepristupujte priamo k údajom svojho objektu; použite jeho metódy.“

To je elementárna myšlienka, ale uľahčuje nám to život ako programátorom. Predstavte si napríklad, že ste chceli poučiť a Osoba objekt postaviť sa. Bez zapuzdrenia by vaše príkazy mohli znieť asi takto: „No, myslím, že by si potreboval napnúť tento sval tu v prednej časti nohy, uvoľniť tento sval tu v zadnej časti nohy. Hmmm - treba sa ohnúť pás tiež. Ktoré svaly ten pohyb podnecujú? Potrebujete ich utiahnuť, uvoľniť. Hups! Zabudli ste na druhú nohu. Sakra. Dávajte si pozor - neprevrhnite sa ... „Máte nápad. Pri zapuzdrení by ste len potrebovali vyvolať postaviť sa() metóda. Celkom ľahké, že?

Niektoré výhody zapuzdrenia:

  • Abstrakcia detailov: Používateľ interaguje s typom na vyššej úrovni. Ak používate postaviť sa() metódou, už nemusíte poznať všetky svaly potrebné na spustenie tohto pohybu.
  • Izolácia zo zmien:Zmeny v internej implementácii nemajú vplyv na používateľov. Ak si človek vyvrtne členok a na chvíľu bude odkázaný na palicu, používatelia sa stále dovolávajú iba kódupostaviť sa()metóda.
  • Správnosť:Používatelia nemôžu ľubovoľne meniť vnútornú stranu objektu. Môžu dokončiť iba to, čo im umožníš, pomocou metód, ktoré napíšeš.

Tu je krátky príklad, v ktorom zapuzdrenie jednoznačne pomáha pri presnosti programu:

// Zlé - nepoužíva zapuzdrenie verejnej triedy Osoba {int m_age; } public class PersonTest {public static void main (String [] args) {Person p = new Person (); p.m_age = -5; // Hej - ako môže mať niekto mínus 5 rokov? }} // Lepšie - používa zapuzdrenie verejnej triedy Osoba {int m_age; public void setAge (int age) {// Skontrolujte, či je vek väčší ako 0. O výrokoch // hovorím viac v inom čase. if (vek> 0) {m_age = vek; }}} public class PersonTest {public static void main (String [] args) {Person p = new Person (); p.setAge (-5); // Teraz nebude mať žiadny účinok. }} 

Aj tento jednoduchý program ukazuje, ako sa môžete dostať do problémov, ak máte priamy prístup k interným údajom tried. Čím je program rozsiahlejší a zložitejší, tým dôležitejšie je jeho zapuzdrenie. Pamätajte tiež, že veľa programov začína malých rozmerov a potom vydrží neobmedzene dlho, takže je nevyhnutné, aby ste ich navrhovali správne hneď od začiatku. Použiť zapuzdrenie na Budík, môžete jednoducho vytvoriť metódy na manipuláciu s intervalom opakovaného budenia.

Poznámka o metódach

Metódy môžu vrátiť hodnoty, ktoré používa volajúci. Ak chcete vrátiť hodnotu, deklarujte nevratný návratový typ a použite a návrat vyhlásenie. The getSnoozeInterval () ilustruje to metóda uvedená v príklade nižšie.

Napíš program

$config[zx-auto] not found$config[zx-overlay] not found