Hej! Vi ägnar dagens lektion åt Encapsulation in Java och börjar med exempel direkt utanför porten:) Här har du en vanlig läskautomat . Jag har en fråga till dig: hur fungerar det? Försök att ge ett utförligt svar: Var kommer läsken ifrån? Hur upprätthålls den inre temperaturen? Var förvaras isen? Hur vet maskinen vilken sirap som ska tillsättas? Du har förmodligen inga svar på dessa frågor. Okej, kanske inte alla använder dessa maskiner. De är inte så populära just nu. Låt oss prova ett annat exempel. Något du definitivt använder många gånger varje dag. Åh, jag har en idé! Berätta för mig hur Googles sökmotorArbetar. Hur exakt söker den efter information om orden du anger? Varför är dessa resultat i toppen och inte andra? Även om du använder Google varje dag vet du förmodligen inte. Men det spelar ingen roll. Det är trots allt inget du behöver veta. Du kan använda en sökmotor utan att tänka på exakt hur den fungerar. Du kan köpa läsk från en maskin utan att veta hur den är byggd. Du kan köra bil utan att fördjupa dig i hur förbränningsmotorn fungerar och utan att ens kunna gymnasiefysik. Allt detta är möjligt tack vare en av huvudprinciperna för objektorienterad programmering: inkapsling. När du läste olika artiklar om ämnet måste du ha stött på två utbredda programmeringsbegrepp: inkapsling och informationsgömma. När det händer förstår olika människor ordet ' inkapsling' att betyda olika saker. Vi kommer att dechiffrera båda termerna så att du har en fullständig förståelse. I programmering, den ursprungliga betydelsen avinkapsling var att kombinera data och metoder för att arbeta med dessa data i ett paket ("kapsel"). I Java är encapsulating package klassen . Klassen innehåller både data (fält) och metoder för att arbeta med den datan. Detta kan verka självklart för dig, men allt är ordnat annorlunda i andra programmeringsparadigm. Till exempel i funktionell programmering är data strikt separerade från dataoperationer. Inom objektorienterad programmering (OOP) består program av kapslar (klasser) bestående av både data och funktioner för att arbeta med data.
Låt oss nu prata om att gömma information
Hur använder vi alla möjliga komplexa mekanismer utan att förstå hur de är uppbyggda eller hur de fungerar? Det är enkelt: deras skapare tillhandahöll enkla och bekväma gränssnitt. På en läskmaskin är gränssnittet knapparna på frontpanelen. En knapp låter dig välja koppstorlek. Du väljer sirapen med en andra knapp. En tredje är ansvarig för att lägga is. Och det är allt du behöver göra. Det spelar ingen roll hur maskinen ser ut inuti. Det viktiga är att den är designad så att användaren får i sig läsk genom att trycka på tre knappar. Samma sak gäller för en bil. Det spelar ingen roll vad som händer inuti. Det viktiga är att när du trycker på höger pedal så rör sig bilen framåt, och när du trycker på vänster pedal saktar bilen ner. Detta är kärnan i att gömma information. Allt av ett program' s "inälvor" är dolda för användaren. Sådan information är överflödig eller onödig för användaren. Användaren behöver ett slutresultat, inte en intern process. För ett exempel, låt oss ta en titt påFordonsklass :
public class Vehicle {
public void gas() {
/* Some complicated things happen inside a car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside a car.
As a result, it slows down */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// How everything looks to the user
// Press one pedal, the car moves
vehicle.gas();
// Press the other pedal, the car brakes
vehicle.brake();
}
}
Så här döljs implementeringen i ett Java-program. Precis som i verkligheten: användaren förses med ett gränssnitt (metoder). I ett program, om du behöver en bil för att utföra en åtgärd, ringer du helt enkelt den önskade metoden. Det som händer i dessa metoder är överflödigt. Det viktiga är att allt fungerar som det ska. Här har vi pratat om implementeringsdöljning. Java har också datadöljande. Vi skrev om det i lektionen om getters och setters, men en påminnelse skadar inte. Till exempel har vi en Cat -klass:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
Kanske kommer du ihåg från en tidigare lektion vad problemet är med den här klassen? Om inte, låt oss komma ihåg. Problemet är att dess data (fält) är öppna för alla. En annan programmerare kan enkelt skapa en namnlös katt med en vikt på 0 och en ålder på -1000 år:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
I den här situationen kan du noggrant spåra om en av dina kollegor skapar objekt med ogiltigt tillstånd, men det skulle vara mycket bättre att eliminera även möjligheten att skapa dessa ogiltiga objekt. Vi uppnår datadöljning med hjälp av:
- åtkomstmodifierare ( privat, skyddat, paketstandard );
- getters och setters.
Inkapsling ger oss flera viktiga fördelar:
- Övervakar korrekt objekttillstånd. Vi gav exempel på detta ovan: tack vare sättaren och den privata modifieraren har vi säkrat vårt program mot katter med vikten 0.
- Användarvänligt gränssnitt. Vi lämnar endast metoder exponerade för användaren. Användaren behöver helt enkelt ringa dem för att få ett resultat. Och det finns inget som helst behov av att fördjupa sig i detaljerna om hur de fungerar.
- Kodändringar påverkar inte användare. Vi gör alla förändringar i metoder. Detta påverkar inte användare: de skrev vehicle.gas() för att applicera gasen, och det är vad de kommer att fortsätta göra. Det faktum att vi ändrade något inuti gas() -metoden förblir osynligt: som tidigare får de helt enkelt det önskade resultatet.
GO TO FULL VERSION