„Java“ sąsajos skiriasi nuo klasių, todėl svarbu žinoti, kaip naudoti specialias jų ypatybes „Java“ programose. Šioje pamokoje pateikiamas klasių ir sąsajų skirtumas, tada pateikiami pavyzdžiai, kaip parodyti, kaip deklaruoti, įdiegti ir išplėsti „Java“ sąsajas.
Taip pat sužinosite, kaip sąsaja vystėsi „Java 8“, pridėjus numatytuosius ir statinius metodus, ir „Java 9“ su naujais privačiais metodais. Šie papildymai daro sąsajas naudingesnes patyrusiems kūrėjams. Deja, jie taip pat ištrina linijas tarp klasių ir sąsajų, todėl sąsajų programavimas dar labiau painioja Java pradedantiesiems.
atsisiųsti Gauti kodą Atsisiųskite šaltinį, pvz., programas, šioje pamokoje. Sukūrė Jeffas Friesenas, skirtas „JavaWorld“.Kas yra „Java“ sąsaja?
An sąsaja yra taškas, kur dvi sistemos susitinka ir sąveikauja. Pavyzdžiui, galite naudoti automato sąsają, kad pasirinktumėte daiktą, sumokėtumėte už jį ir gautumėte maisto ar gėrimo. Žiūrint iš programavimo perspektyvos, sąsaja yra tarp programinės įrangos komponentų. Apsvarstykite, kad metodo antraštės (metodo pavadinimas, parametrų sąrašas ir kt.) Sąsaja yra tarp išorinio kodo, kuris iškviečia metodą, ir kodo, esančio metodo, kuris bus vykdomas dėl skambučio, metu. Štai pavyzdys:
System.out.println (vidurkis (10, 15)); dvigubas vidurkis (dvigubas x, dvigubas y) // sąsaja tarp vidutinio (10, 15) skambučio ir grįžimo (x + y) / 2; {grįžti (x + y) / 2; }
„Java“ pradedantiesiems dažnai painu tai, kad klasės taip pat turi sąsajas. Kaip paaiškinau „Java 101“: „Java“ klasės ir objektai, sąsaja yra klasės dalis, prieinama prie jos esančių kodų. Klasės sąsają sudaro tam tikras metodų, laukų, konstruktorių ir kitų objektų derinys. Apsvarstykite 1 sąrašą.
Sąrašas 1. Sąskaitos klasė ir jos sąsaja
klasės sąskaita {private String name; privati ilga suma; Sąskaita (eilutės pavadinimas, ilga suma) {this.name = vardas; setAmount (suma); } negaliojantis indėlis (ilga suma) {this.suma + = suma; } String getName () {grąžinimo vardas; } long getAmount () {grąžinimo suma; } void setAmount (ilga suma) {this.suma = suma; }}
Sąskaita (eilutės pavadinimas, didelė suma)
konstruktorius ir negaliojantis indėlis (didelė suma)
, Eilutė „getName“ ()
, ilgas „getAmount“ ()
ir void setAmount (didelė suma)
metodai sudaro Sąskaita
klasės sąsaja: prie jų gali prisijungti išorinis kodas. asmeninės eilutės pavadinimas;
ir privati ilga suma;
laukai yra nepasiekiami.
Daugiau apie „Java“ sąsajas
Ką galite padaryti su „Java“ programų sąsajomis? Gaukite apžvalgą su Jeffo šešiais „Java“ sąsajos vaidmenimis.
Metodo kodas, palaikantis metodo sąsają, ir ta klasės sąsają palaikanti klasės dalis (pvz., Privatūs laukai) yra vadinama metodo arba klasės įgyvendinimas. Diegimas turėtų būti paslėptas nuo išorinio kodo, kad jį būtų galima pakeisti, kad atitiktų besikeičiančius reikalavimus.
Kai diegiamos programos, gali atsirasti programinės įrangos komponentų tarpusavio priklausomybė. Pvz., Metodo kodas gali remtis išoriniais kintamaisiais, o klasės vartotojai gali priklausyti nuo laukų, kurie turėjo būti paslėpti. Tai sukabinimas gali sukelti problemų, kai įgyvendinimas turi vystytis (galbūt reikia pašalinti matomus laukus).
Java kūrėjai naudoja sąsajos kalbos funkciją abstrakčioms klasės sąsajoms atsiejimas klases iš savo vartotojų. Orientuodamiesi į „Java“ sąsajas, o ne į klases, galite sumažinti šaltinių kodo nuorodų į klasių pavadinimus skaičių. Tai palengvina perėjimą iš vienos klasės į kitą (galbūt siekiant pagerinti našumą), kai subręsta jūsų programinė įranga. Štai pavyzdys:
Sąrašo pavadinimai = new ArrayList () void print (Sąrašo pavadinimai) {// ...}
Šis pavyzdys deklaruoja ir inicializuoja a vardai
laukas, kuriame saugomas eilučių pavadinimų sąrašas. Pavyzdys taip pat skelbia a spausdinti ()
būdas išspausdinti eilučių sąrašo turinį, galbūt po vieną eilutę eilutėje. Dėl trumpumo aš praleidau metodo įgyvendinimą.
Sąrašas
yra „Java“ sąsaja, apibūdinanti nuoseklų objektų rinkinį. „ArrayList“
yra klasė, apibūdinanti masyvu pagrįstą Sąrašas
„Java“ sąsaja. Naujas „ArrayList“
klasė gaunama ir priskiriama Sąrašas
kintamasis vardai
. (Sąrašas
ir „ArrayList“
yra saugomi standartinės klasės bibliotekoje java.util
pakuotė.)
Kampiniai skliaustai ir bendrieji
Kampiniai skliaustai (<
ir >
) yra „Java“ bendrųjų funkcijų rinkinio dalis. Jie tai nurodo vardai
apibūdina eilučių sąrašą (sąraše gali būti saugomos tik eilutės). Pristatysiu generinius vaistus būsimame „Java 101“ straipsnyje.
Kai kliento kodas sąveikauja su vardai
, jis pasitelks tuos metodus, kuriuos deklaruoja Sąrašas
ir kuriuos įgyvendina „ArrayList“
. Kliento kodas nebus tiesiogiai sąveikauja su „ArrayList“
. Todėl kliento kodas nenutrūks, kai bus naudojama kita įgyvendinimo klasė, pvz „LinkedList“
, būtina:
Sąrašų pavadinimai = naujas „LinkedList“ () // ... negaliojantis spausdinimas (sąrašo pavadinimai) {// ...}
Nes spausdinti ()
metodo parametro tipas yra Sąrašas
, šio metodo įgyvendinimo nereikia keisti. Tačiau jei tipas buvo „ArrayList“
, tipas turėtų būti pakeistas į „LinkedList“
. Jei abi klasės deklaruotų savo unikalius metodus, gali reikėti gerokai pasikeisti spausdinti ()
įgyvendinimas.
Atsiejimas Sąrašas
nuo „ArrayList“
ir „LinkedList“
leidžia rašyti kodą, kuris yra apsaugotas nuo klasės diegimo pakeitimų. Naudodami „Java“ sąsajas galite išvengti problemų, kurios gali kilti pasikliaujant įgyvendinimo klasėmis. Šis atsiejimas yra pagrindinė „Java“ sąsajų naudojimo priežastis.
„Java“ sąsajų deklaravimas
Deklaruojate sąsają laikydamiesi klasės panašios sintaksės, kurią sudaro antraštė, po kurios eina turinys. Antraštę sudaro bent raktinis žodis sąsaja
po kurio nurodomas sąsają identifikuojantis pavadinimas. Kūnas prasideda atviro breketo personažu ir baigiasi glaudžiu petnešomis. Tarp šių skyriklių yra pastovios ir metodo antraštės deklaracijos:
sąsaja identifikatorius {// sąsajos turinys}
Pagal susitarimą, pirmoji sąsajos pavadinimo raidė yra didžiosios, o vėlesnės - mažosios (pavyzdžiui, Piešiamas
). Jei vardą sudaro keli žodžiai, kiekvieno žodžio pirmoji raidė yra didžioji (pvz., „DrawableAndFillable“
). Ši vardų suteikimo tvarka yra žinoma kaip „CamelCasing“.
2 sąraše deklaruojama sąsaja pavadinta Piešiamas
.
Sąrašas 2. „Java“ sąsajos pavyzdys
sąsaja Piešiama {int RED = 1; int ŽALI = 2; int MĖLYNA = 3; int JUODAS = 4; int BALTAS = 5; tuštumas piešti (int spalva); }
Sąsajos standartinėje „Java“ klasės bibliotekoje
Pavadinimų suteikimo tvarka daugelis „Java“ standartinės klasės bibliotekos sąsajų baigiasi „ sugeba priesaga. Pavyzdžiai: Skambinama
, Klonuojamas
, Palyginamas
, Formatuojamas
, Pasikartojantis
, Bėgama
, Serijinis
ir Perleidžiama
. Tačiau priesaga nėra privaloma; standartinėje klasės bibliotekoje yra sąsajos CharSequence
, IškarpinėSavininkas
, Kolekcija
, Vykdytojas
, Ateitis
, Iteratorius
, Sąrašas
, Žemėlapis
ir daugelis kitų.
Piešiamas
deklaruoja penkis laukus, kuriuose nurodomos spalvų konstantos. Ši sąsaja taip pat deklaruoja a antraštę piešti ()
metodas, kurį reikia iškviesti su viena iš šių konstantų, norint nurodyti spalvą, naudojamą kontūro piešimui. (Sveikų skaičių konstantų naudojimas nėra gera idėja, nes bet kuri sveikojo skaičiaus reikšmė gali būti perduota piešti ()
. Tačiau jų pakanka paprastame pavyzdyje.)
Numatytieji lauko ir metodo antraštės
Sąsajoje deklaruojami laukai yra netiesiogiai viešoji galutinė statika
. Sąsajos metodo antraštės yra netiesiogiai vieša santrauka
.
Piešiamas
nurodo nuorodos tipą, kuriame nurodoma, ką daryti (nupiešti ką nors), bet ne tai, kaip tai padaryti. Informacija apie įgyvendinimą siunčiama į klases, kurios įdiegia šią sąsają. Tokių klasių egzemplioriai yra vadinami ištraukiamaisiais, nes jie moka piešti patys.
Žymeklių ir žymėjimo sąsajos
Sąsaja su tuščiu kūnu vadinama a žymeklio sąsaja arba a žymėjimo sąsaja. Sąsaja egzistuoja tik norint susieti metaduomenis su klase. Pavyzdžiui, Klonuojamas
(žr. „Java“ paveldėjimas, 2 dalis) reiškia, kad jos įgyvendinimo klasės egzempliorius galima sekliai klonuoti. Kada Objektas
's klonas ()
metodas aptinka (per vykdymo tipo identifikavimą), kurį skambinančio egzemplioriaus klasė įgyvendina Klonuojamas
, jis negiliai klonuoja objektą.
Java sąsajų diegimas
Klasė įdiegia sąsają pridėdama „Java“ padargai
raktinis žodis, po kurio kableliais atskirtas sąsajų pavadinimų sąrašas prie klasės antraštės, ir koduojant kiekvieną klasės sąsajos metodą. 3 sąraše pateikiama klasė, įgyvendinanti 2 sąrašą Piešiamas
sąsaja.
Sąrašas 3. Apskritimas, įgyvendinantis „Drawable“ sąsają
klasės „Circle“ padargai „Drawable“ {privatus dvigubas x, y, spindulys; Apskritimas (dvigubas x, dvigubas y, dvigubas spindulys) {this.x = x; tai.y = y; tai.spindulys = spindulys; } @Paisyti viešo tuštumo piešimą (int spalva) {System.out.println ("Apskritimas nubrėžtas ties (" + x + "," + y + "), spinduliu" + spindulys + "ir spalva" + spalva); } dvigubas getRadius () {grįžimo spindulys; } dvigubas getX () {return x; } dvigubas getY () {return y; }}
3 sąrašas Apskritimas
klasėje apskritimas apibūdinamas kaip centro taškas ir spindulys. Be konstruktoriaus ir tinkamų metodų pateikimo, Apskritimas
įgyvendina Piešiamas
sąsaja pridedant padargai Piešiami
į Apskritimas
antraštę ir nepaisydami (kaip rodo @ Nepaisyti
anotacija) Piešiamas
's piešti ()
metodo antraštė.
4 sąraše pateikiamas antrasis pavyzdys: a Stačiakampis
klasė, kuri taip pat įgyvendina Piešiamas
.
Sąrašas 4. „Drawable“ sąsajos įgyvendinimas stačiakampio kontekste
klasės Stačiakampio įrankiai Piešiami {privatūs dvigubi x1, y1, x2, y2; Stačiakampis (dvigubas x1, dvigubas y1, dvigubas x2, dvigubas y2) {this.x1 = x1; tai.y1 = y1; tai.x2 = x2; tai.y2 = y2; } @Paisyti viešo tuštumo piešimą (int spalva) {System.out.println ("Stačiakampis nubrėžtas viršutiniu kairiuoju kampu ties (" + x1 + "," + y1 + ") ir apatiniame dešiniajame kampe ties (" + x2 + "," + y2 + ") ir spalva" + spalva); } dvigubas getX1 () {return x1; } dvigubas getX2 () {return x2; } dvigubas getY1 () {grąžinti y1; } dvigubas getY2 () {grąžinti y2; }}
4 sąrašas Stačiakampis
klasėje stačiakampis apibūdinamas kaip taškų pora, žyminti šios formos viršutinį kairįjį ir apatinį dešinįjį kampus. Kaip ir su Apskritimas
, Stačiakampis
pateikia konstruktorių ir tinkamus metodus, taip pat įgyvendina Piešiamas
sąsaja.
Nepaisomos sąsajos metodo antraštės
Kompiliatorius praneša apie klaidą, kai bandote sudaryti neabstraktus
klasė, į kurią įeina padargai
sąsajos sąlyga, bet nepaiso visų sąsajos metodo antraščių.
Sąsajos tipo duomenų vertės yra objektai, kurių klasės įgyvendina sąsają ir kurių elgesys yra tas, kurį nurodo sąsajos metodo antraštės. Šis faktas reiškia, kad galite priskirti objekto nuorodą sąsajos tipo kintamajam, jei objekto klasė įgyvendina sąsają. 5 sąrašas rodo.
Išvardijami 5. Apskritimo ir stačiakampio objektai kaip piešiamieji
klasė Lygiosios {public static void main (String [] args) {Drawable [] drawables = new Drawable [] {new Circle (10, 20, 15), new Circle (30, 20, 10), new Stačiakampis (5, 8 , 8, 9)}; už (int i = 0; i <traukiamieji.ilgis; i ++) piešiamieji [i] .piešti (Drawable.RED); }}
Nes Apskritimas
ir Stačiakampis
įgyvendinti Piešiamas
, Apskritimas
ir Stačiakampis
objektai turi Piešiamas
tipą be savo klasių tipų. Todėl teisėta saugoti kiekvieno objekto nuorodą masyve Piešiamas
s. Kilpa kartojasi per šį masyvą, iškviečiant kiekvieną Piešiamas
objekto piešti ()
metodas nubrėžti apskritimą ar stačiakampį.
Darant prielaidą, kad 2 sąrašas yra saugomas a Piešiama.java
šaltinio failas, kuris yra tame pačiame kataloge kaip Apskritimas.java
, Stačiakampis.java
ir Lygiosios.java
šaltinio failai (kuriuose atitinkamai saugomi 3, 4 ir 5 sąrašai), sukompiliuokite šiuos šaltinio failus naudodami bet kurią iš šių komandų:
javac Draw.java javac * .java
Paleiskite Lygiosios
paraišką taip:
java Lygiosios
Turėtumėte stebėti šį rezultatą:
Apskritimas, nubrėžtas ties (10,0, 20,0), spinduliu 15,0, ir spalva 1 Apskritimas, nubrėžtas ties (30,0, 20,0), su spinduliu 10,0 ir spalva 1 Stačiakampis nubrėžtas viršutiniu kairiuoju kampu ties (5,0, 8,0) ir apatiniu dešiniuoju kampu (8.0, 9.0) ir 1 spalva
Atminkite, kad taip pat galite sugeneruoti tą patį išvestį, nurodydami šiuos duomenis pagrindinis ()
metodas:
public static void main (String [] args) {apskritimas c = naujas apskritimas (10, 20, 15); c. nupiešti (Drawable.RED); c = naujas ratas (30, 20, 10); c. nupiešti (Drawable.RED); Stačiakampis r = naujas stačiakampis (5, 8, 8, 9); r.draw (Drawable.RED); }
Kaip matote, nuobodu pakartotinai kreiptis į kiekvieną objektą piešti ()
metodas. Be to, taip pridėjus papildomą baitą Lygiosios
klasės failą. Galvodamas apie Apskritimas
ir Stačiakampis
kaip Piešiamas
s, galite panaudoti masyvą ir paprastą kilpą, kad supaprastintumėte kodą. Tai yra papildoma nauda kuriant kodą pirmenybę teikiant sąsajoms, o ne klasėms.