Programavimas

Sąsajos „Java“

„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šasir 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, Serijinisir 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šiamass. 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.javair 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ą Lygiosiosklasės failą. Galvodamas apie Apskritimas ir Stačiakampis kaip Piešiamass, galite panaudoti masyvą ir paprastą kilpą, kad supaprastintumėte kodą. Tai yra papildoma nauda kuriant kodą pirmenybę teikiant sąsajoms, o ne klasėms.

Atsargiai!

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