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
TIP | Bajt | Kratek | Int | dolga |
---|---|---|---|---|
VELIKOST (bitov) | 8 | 16 | 32 | 64 |
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)
TIP | Plavajoča vejica z eno natančnostjo | Dvojna natančnost s plavajočo vejico |
---|---|---|
VELIKOST (bitov) | 32 | 64 |
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.
JavaWorldKapsulacija
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 na
Vstani()
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.