Programmēšana

Saskarnes Java valodā

Java saskarnes atšķiras no klasēm, un ir svarīgi zināt, kā to īpašās īpašības izmantot Java programmās. Šī apmācība iepazīstina ar atšķirību starp klasēm un saskarnēm, pēc tam iepazīstina ar piemēriem, kas parāda, kā deklarēt, ieviest un paplašināt Java saskarnes.

Jūs arī uzzināsiet, kā saskarne ir attīstījusies Java 8, pievienojot noklusējuma un statiskās metodes, un Java 9 ar jaunajām privātajām metodēm. Šie papildinājumi padara saskarnes noderīgākas pieredzējušiem izstrādātājiem. Diemžēl tie arī izpludina līnijas starp klasēm un saskarnēm, padarot saskarnes programmēšanu Java iesācējiem vēl mulsinošāku.

lejupielādēt Iegūt kodu Lejupielādējiet šajā apmācībā avota kodu, piemēram, lietojumprogrammām. Izveidoja Jeff Friesen JavaWorld.

Kas ir Java saskarne?

An interfeiss ir punkts, kur divas sistēmas satiekas un mijiedarbojas. Piemēram, jūs varat izmantot tirdzniecības automāta saskarni, lai izvēlētos preci, samaksātu par to un saņemtu ēdienu vai dzērienu. No programmēšanas viedokļa starp programmatūras komponentiem atrodas saskarne. Apsveriet, ka metodes galvenes (metodes nosaukums, parametru saraksts un tā tālāk) saskarne atrodas starp ārējo kodu, kas izsauc metodi, un kodu metodē, kas tiks izpildīts zvana rezultātā. Lūk, piemērs:

System.out.println (vidēji (10, 15)); dubultā vidējā (double x, double y) // saskarne starp vidējo (10, 15) zvanu un atgriešanos (x + y) / 2; {atgriešanās (x + y) / 2; }

Java iesācējiem bieži vien mulsina tas, ka klasēs ir arī saskarnes. Kā es paskaidroju Java 101: klases un objekti Java, interfeiss ir tā klases daļa, kurai var piekļūt kods, kas atrodas ārpus tā. Klases interfeiss sastāv no dažām metožu, lauku, konstruktoru un citu entītiju kombinācijām. Apsveriet 1. sarakstu.

Saraksts 1. Konta klase un tās saskarne

klases konts {private String name; privāta gara summa; Konts (virknes nosaukums, garā summa) {this.name = nosaukums; setAmount (summa); } anulētais depozīts (garā summa) {this.summa + = summa; } String getName () {atgriešanās nosaukums; } ilgi getAmount () {atgriešanas summa; } void setAmount (garā summa) {this.summa = summa; }}

The Konts (virknes nosaukums, liela summa) konstruktors un anulēts depozīts (liela summa), Virkne getName (), ilgi getAmount (), un void setAmount (liela summa) metodes veido Konts klases interfeiss: tie ir pieejami ārējam kodam. The privāts virknes nosaukums; un privāta gara summa; lauki nav pieejami.

Vairāk par Java saskarnēm

Ko jūs varat darīt ar saskarnēm jūsu Java programmās? Iegūstiet pārskatu ar Džefa sešām Java saskarnes lomām.

Metodes kods, kas atbalsta metodes saskarni, un tā klases daļa, kas atbalsta klases saskarni (piemēram, privātie lauki), ir pazīstama kā metodes vai klases ieviešana. Īstenojums ir jāslēpj no ārējā koda, lai to varētu mainīt, lai tas atbilstu mainīgajām prasībām.

Ja ieviešana ir pakļauta, var rasties savstarpēja atkarība starp programmatūras komponentiem. Piemēram, metodes kods var balstīties uz ārējiem mainīgajiem, un klases lietotāji var kļūt atkarīgi no laukiem, kurus vajadzēja paslēpt. Šis sakabe var radīt problēmas, kad jāattīstās ieviešanai (iespējams, ir jānoņem pakļauti lauki).

Java izstrādātāji izmanto saskarnes valodas funkciju, lai abstraktētu klases saskarnes atsaistīšana klases no saviem lietotājiem. Koncentrējoties uz Java saskarnēm, nevis klasēm, jūs varat samazināt atsauču skaitu uz klases nosaukumiem avota kodā. Tas atvieglo pāreju no vienas klases uz otru (iespējams, lai uzlabotu veiktspēju), kad jūsu programmatūra nobriest. Šeit ir piemērs:

Sarakstu nosaukumi = new ArrayList () void print (Sarakstu nosaukumi) {// ...}

Šis piemērs deklarē un inicializē a nosaukumi lauks, kurā glabājas virkņu nosaukumu saraksts. Piemērs arī deklarē a izdrukāt () metode virkņu saraksta satura izdrukāšanai, iespējams, viena virkne katrā rindā. Īsuma labad esmu izlaidis metodes ieviešanu.

Saraksts ir Java saskarne, kas apraksta secīgu objektu kolekciju. ArrayList ir klase, kas apraksta uz masīvu balstītu Saraksts Java saskarne. Jauna ArrayList klase tiek iegūta un piešķirta Saraksts mainīgais nosaukumi. (Saraksts un ArrayList tiek glabāti standarta klases bibliotēkā java.util iepakojums.)

Leņķa iekavas un sugas

Leņķa iekavas (< un >) ir daļa no Java vispārīgo funkciju kopas. Viņi to norāda nosaukumi apraksta virkņu sarakstu (sarakstā var saglabāt tikai virknes). Es iepazīstināšu ar vispārīgām zālēm nākamajā Java 101 rakstā.

Kad klienta kods mijiedarbojas ar vārdi, tā izmantos tās metodes, kuras deklarējusi Saraksts, un kuras īsteno ArrayList. Klienta kods tieši nesadarbosies ArrayList. Tā rezultātā klienta kods netiks pārtraukts, kad tiks ieviesta cita ieviešanas klase, piemēram LinkedList, ir nepieciešams:

Sarakstu nosaukumi = new LinkedList () // ... void print (Sarakstu nosaukumi) {// ...}

Tāpēc ka izdrukāt () metodes parametra tips ir Saraksts, šīs metodes ieviešana nav jāmaina. Tomēr, ja tips būtu bijis ArrayList, tips būtu jāmaina uz LinkedList. Ja abas klases paziņo par savām unikālajām metodēm, iespējams, būs jāmaina izdrukāt ()ieviešana.

Atdalīšana Saraksts no ArrayList un LinkedList ļauj rakstīt kodu, kas nav aizsargāts pret klases ieviešanas izmaiņām. Izmantojot Java saskarnes, jūs varat izvairīties no problēmām, kas varētu rasties, paļaujoties uz ieviešanas klasēm. Šī atsaistīšana ir galvenais Java saskarņu izmantošanas iemesls.

Java saskarņu deklarēšana

Jūs deklarējat saskarni, ievērojot klases veida sintaksi, kas sastāv no galvenes, kam seko pamatteksts. Vismaz galvene sastāv no atslēgvārda interfeiss seko nosaukums, kas identificē saskarni. Ķermenis sākas ar atvērta veida stiprinājumu un beidzas ar tuvu stiprinājumu. Starp šiem atdalītājiem ir nemainīgas un metodes galvenes deklarācijas:

interfeiss identifikators {// saskarnes pamatteksts}

Pēc vienošanās saskarnes nosaukuma pirmais burts tiek ievadīts ar lielajiem burtiem, bet nākamie burti - ar mazajiem burtiem (piemēram, Zīmējams). Ja nosaukums sastāv no vairākiem vārdiem, katra vārda pirmais burts tiek ievadīts ar lielo burtu (piemēram, DrawableAndFillable). Šī vārdu piešķiršanas kārtība ir pazīstama kā CamelCasing.

2. sarakstā tiek deklarēta saskarne ar nosaukumu Zīmējams.

Saraksts 2. Java saskarnes piemērs

saskarne Zīmējama {int RED = 1; int ZAĻA = 2; int ZILS = 3; int MELNS = 4; int BALTS = 5; tukšums izdarīt (int krāsa); }

Saskarnes Java standarta klases bibliotēkā

Kā nosaukumu piešķiršanas konvencija, daudzas Java standarta klases bibliotēkas saskarnes beidzas ar spējīgs sufikss. Piemēri ietver Zvanāms, Klonējams, Salīdzināms, Formatējams, Atkārtojams, Skrienams, Serializējams, un Nododams. Tomēr sufikss nav obligāts; standarta klases bibliotēkā ir saskarnes CharSequence, Starpliktuve Īpašnieks, Kolekcija, Izpildītājs, Nākotne, Iterators, Saraksts, Karte un daudzi citi.

Zīmējams deklarē piecus laukus, kas identificē krāsu konstantes. Šī saskarne deklarē arī a galveni izdarīt () metode, kas jāizsauc ar kādu no šīm konstantēm, lai norādītu krāsu, ko izmanto kontūras zīmēšanai. (Veselu skaitļu konstantu izmantošana nav laba ideja, jo jebkurai veselā skaitļa vērtībai var nodot izdarīt (). Tomēr pietiek ar vienkāršu piemēru.)

Lauka un metodes galvenes noklusējumi

Interfeisā deklarētie lauki ir netieši publiskais galīgais statiskais. Interfeisa metodes galvenes ir netieši publisks abstrakts.

Zīmējams identificē atsauces tipu, kas norāda, ko darīt (kaut ko uzzīmēt), bet ne to, kā to izdarīt. Informācija par ieviešanu tiek nosūtīta klasēm, kurās tiek ieviesta šī saskarne. Šādu klašu gadījumus sauc par izņemamiem, jo ​​viņi zina, kā izdarīt paši.

Marķieru un marķēšanas saskarnes

Saskarne ar tukšu ķermeni ir pazīstama kā a marķiera saskarne vai a iezīmēšanas saskarne. Saskarne pastāv tikai metadatu saistīšanai ar klasi. Piemēram, Klonējams (skat. Mantošana Java, 2. daļa) nozīmē, ka tās ieviešanas klases gadījumus var sekli klonēt. Kad Objekts's klons () metode nosaka (izmantojot izpildlaika tipa identifikāciju), ko izsaucošās instances klase īsteno Klonējams, tas sekli klonē objektu.

Java saskarņu ieviešana

Klase ievieš saskarni, pievienojot Java īsteno atslēgvārds, kam seko komatu atdalīts interfeisu nosaukumu saraksts klases galvenē, un kodējot katru klases saskarnes metodi. 3. sarakstā tiek parādīta klase, kas īsteno 2. sarakstu Zīmējams interfeiss.

Saraksts 3. Aplis, kas īsteno Drawable saskarni

klases apļa rīki Drawable {private double x, y, rādiuss; Aplis (dubultā x, dubultā y, dubultā rādiuss) {this.x = x; tas.y = y; this.radius = rādiuss; } @Orride public void draw (int color) {System.out.println ("Aplis novilkts pie (" + x + "," + y + "), ar rādiusu" + rādiuss + "un krāsa" + krāsa); } dubultā getRadius () {atgriešanās rādiuss; } dubultā getX () {atgriešanās x; } dubultā getY () {atgriešanās y; }}

Saraksts 3 Aplis klase apraksta apli kā centra punktu un rādiusu. Papildus konstruktora un piemērotu uzlabošanas metožu nodrošināšanai Aplis īsteno Zīmējams interfeisu, pievienojot rīki Drawable uz Aplis galveni un ignorējot (kā norāda @ Pārvarēt anotācija) Zīmējams's izdarīt () metodes galvene.

4. sarakstā ir otrs piemērs: a Taisnstūris klase, kas arī īsteno Zīmējams.

Saraksts 4. Drawable saskarnes ieviešana taisnstūra kontekstā

klases Taisnstūra rīki Drawable {private double x1, y1, x2, y2; Taisnstūris (dubultā x1, dubultā y1, dubultā x2, dubultā y2) {this.x1 = x1; this.y1 = y1; šis.x2 = x2; this.y2 = y2; } @Orride public void draw (int color) {System.out.println ("Taisnstūris zīmēts ar augšējo kreiso stūri pie (" + x1 + "," + y1 + ") un apakšējā labajā stūrī pie (" + x2 + "," + y2 + ") un krāsa" + krāsa); } dubultā getX1 () {atgriešanās x1; } dubultā getX2 () {atgriešanās x2; } dubultā getY1 () {atgriešanās y1; } dubultā getY2 () {atgriešanās y2; }}

Uzskaita 4 Taisnstūris klasē taisnstūri raksturo kā punktu pāri, kas apzīmē šīs formas augšējo kreiso un apakšējo labo stūri. Kā ar Aplis, Taisnstūris nodrošina konstruktoru un piemērotas labākās metodes, kā arī ievieš Zīmējams interfeiss.

Svarīgākas saskarnes metodes galvenes

Sastādītājs ziņo par kļūdu, kad mēģināt sastādītabstrakts klase, kurā ietilpst īsteno saskarnes klauzula, bet neņem vērā visas saskarnes metožu galvenes.

Saskarnes veida datu vērtības ir objekti, kuru klases īsteno saskarni un kuru rīcība ir norādīta saskarnes metožu galvenēs. Šis fakts nozīmē, ka jūs varat piešķirt objekta atsauci interfeisa tipa mainīgajam, ja objekta klase īsteno saskarni. 5. saraksts parāda.

5. saraksta un taisnstūra objektu maiņa kā zīmējamie

klase Draw {public static void main (String [] args) {Drawable [] drawables = new Drawable [] {jauns aplis (10, 20, 15), jauns aplis (30, 20, 10), jauns taisnstūris (5, 8) , 8, 9)}; par (int i = 0; i <izvelkamie.garums; i ++) izvelkamie [i] .zīmē (Izvelkamais.RED); }}

Tā kā Aplis un Taisnstūris ieviest Zīmējams, Aplis un Taisnstūris objekti ir Zīmējams tips papildus viņu klases tipiem. Tāpēc ir likumīgi katru objekta atsauci saglabāt masīvā Zīmējamss. Cilpa atkārtojas šajā masīvā, izsaucot katru Zīmējams objekta izdarīt () metode, kā uzzīmēt apli vai taisnstūri.

Pieņemot, ka 2. saraksts tiek saglabāts a Zīmējama.java avota fails, kas atrodas tajā pašā direktorijā kā Circle.java, Taisnstūris.java, un Zīmēt.java avota faili (kas attiecīgi glabā 3., 4. un 5. sarakstu), apkopo šos avota failus, izmantojot kādu no šīm komandrindām:

javac Draw.java javac * .java

Palaidiet Zīmēt pieteikumu šādi:

java Draw

Jums jāievēro šāda izeja:

Aplis, kas uzzīmēts pie (10.0, 20.0), ar rādiusu 15.0, un krāsa 1 Aplis, kas uzzīmēts ar (30.0, 20.0), ar rādiusu 10.0 un 1. krāsu. (8.0, 9.0) un 1. krāsa

Ņemiet vērā, ka jūs varat arī ģenerēt to pašu izvadi, norādot šo galvenais () metode:

public static void main (String [] args) {aplis c = jauns aplis (10, 20, 15); c. zīmēt (Drawable.RED); c = jauns aplis (30, 20, 10); c. zīmēt (Drawable.RED); Taisnstūris r = jauns taisnstūris (5, 8, 8, 9); r.draw (Drawable.RED); }

Kā redzat, ir garlaicīgi atkārtoti izsaukt katru objektu izdarīt () metodi. Turklāt šādi rīkojoties, tiek pievienots papildu baitkods Zīmētklases fails. Domājot par Aplis un TaisnstūrisZīmējamss, jūs varat izmantot masīvu un vienkāršu cilpu, lai vienkāršotu kodu. Tas ir papildu ieguvums, izstrādājot kodu, lai priekšroku dotu saskarnēm, nevis klasēm.

Uzmanību!