Nyckelord: interface, klass, abstraktion
I den här artikeln lär vi oss om interface (svenska: gränssnitt) i Java. Vi lär oss hur man implementerar ett interface och hur man använder dem med hjälp av exempel.
Vi tänkte oss en klass som en mall för egenskaper en klass ska ha, medans ett interface är ett sätt att förbestämma vilka egenskaper en klass ska ha. Ett interface blir med andra ord ett sätt att fördefiniera en klass, så att alla klasser håller samma struktur.
Rent generellt så bidrar interface till ökad abstraktion i våra program. Exempelvis, när man arbetar i större projekt är det vanligt att man sitter i olika projektgrupper som programmerar mot samma program. Då är det viktigt att ha förbestämda krav så att alla utvecklare utgår från samma bestämmelse.
Ett interface är en helt abstrakt klass som innehåller en grupp metoder som inte har något tillhörande kodblock. Det betyder att metoderna i ett interface anger enbart vilka metoder som klassen ska ha, inte vad metoderna ska göra.
Interface är ett sätt att förbestämma vilka metoder en klass ska innehålla.
Interface i Java:
Ett interface i Java skapas med det reserverade ordet interface, följt av det namn man vill använda. Precis som för klasser så är det praxis att namnet på ett interface börjar med stor bokstav.
Om vi använder instruktionerna ovan och skriver in det i kodeditorn
interface NamnInterface { // Metoder tillhörande interface }
Inom måsvingar anger man vilka metoder, det vill säga, vilka egenskaper klassen har. Man anger enbart vilka metoder som klassen ska ha, inte vad metoderna ska göra. Vidare, när man implementerar en klass från ett interface, får klassen automatiskt alla metoder som angivits i interfacet.
För att skapaa en klass från ett interface använder man det reserverade ordet implements
interface NameInterface { // Metoder tillhörande interface } class NameOfClass implements NameInterface { // Kod tillhörande klassen }
Som visas i figur 1 nedan så utökar (extends) en klass en annan klass, ett interface utökar (extends) ett annat interface, men en klass implementerar (implements) ett interface.
Vi ska i detta exempel programmera flera olika djur och eftersom djur har många liknande egenskaper så blir det perfekt att använda ett interface som varje djur kan utgå ifrån. Det betyder alltså att varje nytt djur vi skapar utgår från samma mall, vårt interface, och får samma egenskaper.
Om vi tar och illustrerar hur det här programmet ska vara uppbyggt:
Låt oss börja med att skapa interfacet Animals enligt:
public interface Animal { String whatDoesTheAnimalDo(); String whatDoesTheAnimalSay(); void setName(String name); void setAge(int age); }
Vi inkluderar fyra stycken metoder för vårt interface Animals. Kom ihåg att metoderna i ett interface är abstrakta och vi anger enbart vilka metoder som klassen som skapas från vårt interface ska ha, inte vad metoderna ska göra.
Vidare, nu när vi har vårt interface på plats så använder vi det för att skapa klassen Cow.
public class Cow implements Animal { //Klassvariabler String name; int age; //Definierar konstruktorn Cow(String name, int age){ this.name = name; this.age = age; } @Override public String whatDoesTheAnimalDo() { return null; } @Override public String whatDoesTheAnimalSay() { return null; } @Override public void setName(String name) { return null; } @Override public void setAge(int age) { return null; } }
I vissa IDE, exempelvis IntelliJ, blir metoderna som interfacet innehåller automatiskt skapade när kommandot implements används. Vidare, det är viktigt att notera att alla metoderna som är specificerade i interfacet måste finnas i klassen som blir implementerat, annars kommer vi få ett kompileringsfel.
Nyckelordet @override skrivs ut av kompilatorn om metoderna har implementerats korrekt, det gör det enklare att hitta eventuella fel, exempelvis om en metod skulle råka vara felstavad.
Alla metoderna som är specificerade i interfacet måste finnas i klassen som implementeras, annars kommer vi få ett kompileringsfel.
När IDE:t skapar metoderna automatiskt, är metoderna tomma eller returnerar null. Det ska vi ändra på nu. Vi skapar även klassen Pig på motsvarande sätt som Cow. Vi skriver inte ut den koden här då den ser likadan som klassen Cow, med enda skillnaden gällande namnet på klassen.
Vidare, vi ska nu skapa två objekt från klassen Cow och klassen Pig, låt oss börja med objektet från klassen Cow.
public class Cow implements Animal { //Klassvariabler String name; int age; //Definierar konstruktorn Cow(String name, int age){ this.name = name; this.age = age; } @Override public String whatDoesTheAnimalDo() { return "The cow is eating"; } @Override public String whatDoesTheAnimalSay() { return "The cow says Moo"; } @Override public void setName(String name) { this.name = name; } @Override public void setAge(int age) { this.age = age; } }
Sedan skapar vi objektet från klassen Pig.
public class Pig implements Animal { //Klassvariabler String name; int age; //Definierar konstruktorn Pig(String name, int age){ this.name = name; this.age = age; } @Override public String whatDoesTheAnimalDo() { return "The pig is sleeping"; } @Override public String whatDoesTheAnimalSay() { return "The pig says oink oink"; } @Override public void setName(String name) { this.name = name; } @Override public void setAge(int age) { this.age = age; } }
Avslutningsvis skapar vi en huvudklass och instansierar ett objekt från varje klass.
public class Farm { public static void main(String args[]){ Cow cow = new Cow("Rosa", 3); Pig pig = new Pig("Piggy", 1); System.out.println(cow.whatDoesTheAnimalDo()); System.out.println(cow.whatDoesTheAnimalSay()); System.out.println(pig.whatDoesTheAnimalDo()); System.out.println(pig.whatDoesTheAnimalSay()); } }
Utskriften när vi anropar metoderna whatDoesTheAnimalDo() och whatDoesTheAnimalSay() blir:
The cow is eating The cow says Moo The pig is sleeping The pig says oink oink
Vi har redan berört ett par av skillnaderna, men låt oss sammanfatta och klargöra det ytterligare.
Lämna gärna feedback med hjälp av stjärnorna nedan och hjälp oss att fortsätta göra sidan bättre.
Vad tyckte du om sidan?
Lämna gärna feedback och hjälp oss göra sidan bättre
Feedback gör oss bättre!
Lämna gärna feedback om vad du tyckte om avsnittet!
Ett interface i Java är en mall över vilka egenskaper/metoder en klass ska innehålla. Därför blir ett interface ett sätt att fördefinera en klass, så att alla klasser håller samma struktur. Man skapar ett interface i Java med det reserverade order interface och för att skapa en klass från ett interface använder man sig av det reserverade ordet implements.
Ett interface i Java skapas med det reserverade order interface och för att sedan skapa en klass från ett interface använder man sig av det reserverade ordet implements.
Dom huvudsakliga skillnaderna är att ett interface kan inte ha någon konstruktor medan en konstruktor är en av de centrala komponenterna i en klass. Samt att alla metoder i ett interface är abstrakta, vilket betyder att metoderna i ett interface anger enbart vilka metoder som klassen ska ha, inte vad metoderna ska utföra.
Nej, det är självklart inget måste, men exempelvis när man arbetar i större projekt är det vanligt att man sitter i olika projektgrupper som programmerar mot samma program. Då är det viktigt att ha förbestämda krav så att alla utvecklare utgår från samma bestämmelse.
Vad tyckte du om sidan?
Lämna gärna feedback och hjälp oss göra sidan bättre
Feedback gör oss bättre!
Lämna gärna feedback om vad du tyckte om avsnittet!