Programiranje

Kako shraniti podatke v predmete Java

Zadnja posodobitev: januar 2020

Čeprav je gumb za dremež verjetno najpogosteje uporabljen gumb na budilki, tudi preprost Budilka razred potrebuje še nekaj funkcij. Na primer, morda boste želeli nadzorovati, kako dolgo bo budilka ostala v načinu dremeža. Če želite dodati takšno funkcijo, morate razumeti, kako Java nadzoruje podatke.

Razvijalci uporabljajo spremenljivke v Javi za shranjevanje podatkov, pri čemer imajo vse spremenljivke podatkovni tip in ime. Podatkovni tip določa vrednosti, ki jih lahko vsebuje spremenljivka. V tej vadnici boste izvedeli, kako integralni tipi vsebujejo celotna števila, tipi s plavajočo vejico imajo realna števila, vrste nizov pa znakovne nize. Nato boste začeli uporabljati spremenljivke primerkov v svojih razredih Java.

Spremenljivke in primitivni tipi

Klican primitivni tipi, integrirani in plavajoči vejici so najpreprostejši podatkovni tipi v Javi. Naslednji program prikazuje integralno vrsto, ki lahko vsebuje pozitivna in negativna cela števila. Ta program ponazarja tudi komentarje, ki dokumentirajo vašo kodo, vendar na noben način ne vplivajo na program.

/ * * To je tudi komentar. Prevajalnik prezre vse, od * prvega / * do "poševnice z zvezdico", s katero se komentar konča. * * Tukaj je "zvezdna poševnica", ki zaključuje komentar. * / javni razred IntegerTest {public static void main (String [] args) {// Tu je deklaracija spremenljivke int, imenovane anInteger, // kateri damo začetno vrednost 100. int anInteger = 100; // razglasimo in inicializiramo anInteger System.out.println (anInteger); // Izhodi 100 // Aritmetiko lahko izvajate tudi s primitivnimi tipi z uporabo // standardnih aritmetičnih operatorjev. celo število = 100 + 100; System.out.println (anInteger); // izhodi 200}} 

Java uporablja tudi vrste s plavajočo vejico, ki lahko vsebujejo realna števila, kar pomeni številke, ki vključujejo decimalno vejico. Tu je primer programa:

javni razred DoubleTest {public static void main (String [] args) {// Tu je izjava dvojne spremenljivke, imenovane aDouble. // Podate tudi začetno vrednost 5,76. dvojni aDouble = 5,76; // razglasimo in inicializiramo aDouble System.out.println (aDouble); // Izhodi 5.76 // Aritmetiko lahko izvajate tudi s tipi s plavajočo vejico. aDvojnik = 5,76 + 1,45; System.out.println (aDouble); // izhodi 7.21}} 

Poskusite zagnati zgornje programe. Ne pozabite, da jih morate prevesti, preden jih lahko zaženete:

javac * .java java IntegerTest java DoubleTest 

Java uporablja štiri integralne vrste in dve vrsti s plavajočo vejico, ki imata različna območja številk in zavzemata različno količino prostora za shranjevanje, kot je prikazano v spodnjih tabelah.

Integralne vrste

TIPBajtKratekIntdolga
VELIKOST (bitov)8163264
OBMOČJE-128 do 127-32.768 do 32.767-2,147,483,648 do 2,147,483,647-263 do 263-1

Vrste s plavajočo vejico (format IEEE 754)

 
TIPPlavajoča vejica z eno natančnostjoDvojna natančnost s plavajočo vejico
VELIKOST (bitov)3264
OBMOČJE+/- 1,18x10-38 do +/- 3,4x1038+/- 2,23x10-308 do +/- 1,8x10308

A vrsta niza ima nize in jih obravnava drugače kot način, kako integrirani in tipi s plavajočo vejico obravnavajo številke. Jezik Java vključuje Vrvica razred, ki predstavlja nize. Niz deklarirate s tipom Vrvica, in ga inicializirajte z navedenim nizom, zaporedjem znakov, ki jih vsebujejo dvojni narekovaji, kot je prikazano spodaj. Z nizom lahko kombinirate tudi dva niza + operater.

// Fragment kode // Izjava spremenljivke s tipa String, // in inicializacija s citiranim nizom "Hello." Niz s = "Pozdravljeni"; // Združevanje niza v s s citiranim nizom "Svet" Niz t = s + "Svet"; System.out.println (t); // Izhodi Pozdravljen, svet

Spremenljiv obseg

Poleg vrste, Obseg je tudi pomembna značilnost spremenljivke. Obseg določa, kdaj je spremenljivka ustvarjena in uničena in kje lahko razvijalec dostopa do spremenljivke znotraj programa. Mesto v vašem programu, kjer prijavite spremenljivko, določa njen obseg.

Do zdaj sem že razpravljal lokalne spremenljivke, ki vsebujejo začasne podatke, ki jih uporabljate znotraj metode. Lokalne spremenljivke prijavite znotraj metod in do njih lahko dostopate samo znotraj teh metod. To pomeni, da lahko pridobite samo lokalne spremenljivke celoštevilo, ki ste ga uporabili v IntegerTest, in aDvojna, ki ste ga uporabili v DoubleTest, od glavne metode, v kateri so bili prijavljeni, in nikjer drugje.

Lokalne spremenljivke lahko prijavite v kateri koli metodi. Spodnja koda prikazuje lokalno spremenljivko v Dremež AlarmClock () metoda:

javni razred AlarmClock {public void snooze () {// Čas dremeža v milisekundah = 5 sekund dolge snoozeInterval = 5000; System.out.println ("ZZZZZ za:" + snoozeInterval); }} 

Lahko prideš do snoozeInterval samo iz dremež() metoda, ki ste jo prijavili snoozeInterval, kot je prikazano tukaj:

javni razred AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); aClock.snooze (); // To je še vedno v redu. // Naslednja vrstica kode je NAPAKA. // Do metode snooze ne morete dostopati snoozeInterval. snoozeInterval = 10000; }} 

Parametri metode

A parameter metode, ki ima obseg, podoben lokalni spremenljivki, je druga vrsta spremenljivke. Parametri metode posredujejo argumente v metode. Ko deklarirate metodo, argumente navedete na seznamu parametrov. Argumente posredujete, ko prikličete metodo. Parametri metode delujejo podobno kot lokalne spremenljivke, saj spadajo v obseg metode, na katero so povezani, in se lahko uporabljajo v celotni metodi. Vendar pa za razliko od lokalnih spremenljivk parametri metode od klicatelja dobijo vrednost, ko pokliče metodo. Tukaj je sprememba budilke, ki vam omogoča, da vstopite v snoozeInterval.

javni razred AlarmClock {javna void snooze (long snoozeInterval) {System.out.println ("ZZZZZ za:" + snoozeInterval); }} 
javni razred AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); // Ko pokličete metodo, preidite v interval dremeža. aClock.snooze (10000); // Dremež za 10000 ms. }} 

Spremenljivke člana: Kako predmeti shranjujejo podatke

Lokalne spremenljivke so koristne, ker pa zagotavljajo le začasno shrambo, je njihova vrednost omejena. Ker njihove življenjske dobe zajemajo dolžino metode, v kateri so prijavljene, se lokalne spremenljivke primerjajo z beležko, ki se prikaže vsakič, ko prejmete telefonski klic, vendar izgine, ko odložite slušalko. Ta nastavitev je lahko koristna za zapisovanje zapiskov, včasih pa potrebujete kaj bolj trajnega. Kaj naj naredi programer? Enter spremenljivke člana.

Članske spremenljivke - med katerimi sta dve, primer in statično - sestavni del predavanja.

Spremenljiv obseg in življenjska doba

Razvijalci implementirajo spremenljivke primerkov, da vsebujejo podatke, uporabne za razred. Primerek spremenljivke se razlikuje od lokalne spremenljivke po naravi obsega in življenjske dobe. Celoten razred tvori obseg spremenljivke primerka, ne metoda, v kateri je bila deklarirana. Z drugimi besedami, razvijalci lahko dostopajo do spremenljivk primerka kjer koli v razredu. Poleg tega življenjska doba spremenljivke primerka ni odvisna od nobene posebne metode razreda; to pomeni, da je njegova življenjska doba življenjska doba primerka, ki ga vsebuje.

Primerki so dejanski predmeti, ki jih ustvarite iz načrta, ki ga oblikujete v definiciji razreda. Spremenljivke primerkov prijavite v definiciji razreda in vplivajo na vsak primerek, ki ga ustvarite iz načrta. Vsak primerek vsebuje te spremenljivke primerka, podatki, shranjeni znotraj spremenljivk, pa se lahko razlikujejo od primera do primera.

Razmislite o Budilka razred. Mimo snoozeInterval v dremež() metoda ni odlična zasnova. Predstavljajte si, da morate vsakič, ko ste se dotaknili gumba za dremež, v budilko vtipkati interval dremeža. Namesto tega samo dajte celotni budilki a snoozeInterval. To dopolnite s spremenljivko primerka v datoteki Budilka razred, kot je prikazano spodaj:

javni razred AlarmClock {// tukaj razglasite snoozeInterval. Zaradi tega je spremenljivka primerka. // Tukaj ga tudi inicializirate. dolg m_snoozeInterval = 5000; // Čas dremeža v milisekundah = 5 sekund. public void snooze () {// Do m_snoozeInterval še vedno lahko pridete z metodo AlarmClock //, ker spadate v obseg razreda. System.out.println ("ZZZZZ za:" + m_snoozeInterval); }} 

Do spremenljivk primerka lahko dostopate skoraj povsod znotraj razreda, ki jih razglasi. Če želite biti tehnični glede tega, prijavite spremenljivko primerka znotraj obseg razreda, in ga lahko pridobite skoraj od koder koli znotraj tega obsega. Praktično gledano lahko pridete do spremenljivke kjer koli med prvim zavitim oklepajem, ki zažene razred, in zapiralnim oklepajem. Ker v območju razreda deklarirate tudi metode, lahko tudi one dostopajo do spremenljivk primerka.

Do spremenljivk primerka lahko dostopate tudi zunaj razreda, če obstaja primerek in imate spremenljivko, ki se sklicuje na primerek. Če želite skozi primerek pridobiti spremenljivko primerka, uporabite operator pike skupaj z instanco. To morda ni idealen način za dostop do spremenljivke, za zdaj pa jo za ponazoritev dopolnite na ta način:

javni razred AlarmClockTest {public static void main (String [] args) {// Ustvari dve uri. Vsak ima svoj m_snoozeInterval AlarmClock aClock1 = new AlarmClock (); AlarmClock aClock2 = nov AlarmClock (); // Spremenite aClock2 // Kmalu boste videli, da obstajajo veliko boljši načini za to. aClock2.m_snoozeInterval = 10000; aClock1.snooze (); // Dremež z intervalom aClock1 aClock2.snooze (); // Dremež z intervalom aClock2}} 

Preizkusite ta program in videli boste aClock1 še vedno ima interval 5000, medtem ko aClock2 ima interval 10.000. Spet ima vsak primerek svoje podatke o primerku.

Ne pozabite, da je definicija razreda samo načrt, zato spremenljivke primerka dejansko ne obstajajo, dokler ne ustvarite primerkov iz načrta. Vsak primerek razreda ima svojo kopijo spremenljivk primerka, načrt pa določa, katere bodo te spremenljivke primerka.

JavaWorld

Kapsulacija

Kapsulacija je eden od temeljev objektno usmerjenega programiranja. Pri uporabi enkapsulacije uporabnik interakcijo s tipom prek izpostavljenega vedenja, ne neposredno z notranjo implementacijo. Z enkapsulacijo skrijete podrobnosti izvedbe tipa. V Javi se enkapsulacija v bistvu prevede v to preprosto smernico: "Ne dostopajte neposredno do podatkov vašega predmeta; uporabite njegove metode."

To je osnovna ideja, vendar nam olajša življenje kot programerji. Predstavljajte si na primer, da ste želeli poučiti a Oseba objekt vstati. Brez enkapsulacije bi lahko bili vaši ukazi približno takšni: "No, mislim, da bi morali zategniti to mišico tukaj na sprednji strani noge, sprostiti to mišico tukaj na zadnji strani noge. Hmmm - treba se je upogniti pasu tudi. Katere mišice sprožijo to gibanje? Te je treba zategniti, razrahljati. Ups! Pozabil sem drugo nogo. Prekleto. Pazi, ne prevrni se ... "Razumeš. Z enkapsulacijo bi morali samo priklicati Vstani() metoda. Precej enostavno, ja?

Nekaj ​​prednosti inkapsulacije:

  • Abstrakcija podrobnosti: Uporabnik komunicira s tipom na višji ravni. Če uporabljate Vstani() metode, vam ni več treba poznati vseh mišic, potrebnih za sprožitev tega gibanja.
  • Izolacija od sprememb:Spremembe notranje izvedbe ne vplivajo na uporabnike. Če si človek zvine gleženj in je nekaj časa odvisen od palice, se uporabniki še vedno sklicujejo le naVstani()metoda.
  • Pravilnost:Uporabniki ne morejo samovoljno spreminjati notranjosti predmeta. Dokončajo lahko le tisto, kar jim dovolite, v metodah, ki jih pišete.

Tu je kratek primer, v katerem enkapsulacija očitno pomaga pri natančnosti programa:

// Slabo - ne uporablja enkapsulacije javnega razreda Oseba {int m_age; } javni razred PersonTest {public static void main (String [] args) {Person p = new Person (); p.m_age = -5; // Hej - kako je lahko nekdo star minus 5 let? }} // Boljše - uporablja enkapsulacijo javnega razreda Oseba {int m_age; public void setAge (int age) {// Preverite, ali je starost večja od 0. Več o izjavah // if bom govoril kdaj drugič. if (starost> 0) {m_age = starost; }}} javni razred PersonTest {public static void main (String [] args) {Person p = new Person (); p.setAge (-5); // Zdaj ne bo imel nobenega učinka. }} 

Tudi ta preprost program kaže, kako lahko zdrsnete v težave, če neposredno dostopate do notranjih podatkov razredov. Večji in bolj zapleten je program, pomembnejša je kapsulacija. Ne pozabite tudi, da se številni programi začnejo majhno in nato trajajo neomejeno dolgo, zato je nujno, da jih pravilno oblikujete že od začetka. Za uporabo enkapsulacije na Budilka, lahko samo ustvarite metode za upravljanje intervala dremeža.

Opomba o metodah

Metode lahko vrnejo vrednosti, ki jih uporablja klicatelj. Če želite vrniti vrednost, razglasite neizogibno vrsto vrnitve in uporabite a vrnitev izjavo. The getSnoozeInterval () metoda, prikazana v spodnjem primeru, to ponazarja.

Napišite program

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