Abstraktni razred in vmesnik se uporabljata za definiranje pogodb v objektno usmerjenem programiranju, vendar obstaja nekaj ključnih razlik med njima.
Razlika med abstraktnim razredom in vmesnikom: -
Definicija: Abstraktni razred je razred, ki ga ni mogoče instancirati in lahko vsebuje abstraktne in neabstraktne metode. Po drugi strani pa je vmesnik pogodba, ki določa nabor metod, ki jih mora izvajati razred.
Implementacija metode: V abstraktnem razredu je mogoče implementirati nekatere metode, druge pa ostanejo abstraktne, kar pomeni, da nimajo implementacije in jih morajo preglasiti konkretni podrazredi. Nasprotno pa so vse metode v vmesniku privzeto abstraktne in jih mora implementirati vsak razred, ki implementira vmesnik.
stringbuilder
Dedovanje: razred lahko podeduje samo en abstraktni razred, lahko pa izvaja več vmesnikov. To je zato, ker abstraktni razred predstavlja vrsto predmeta, medtem ko vmesnik predstavlja nabor vedenj.
Modifikatorji dostopa: Abstraktni razredi imajo lahko modifikatorje dostopa, kot so javni, zaščiteni in zasebni za svoje metode in lastnosti, medtem ko imajo lahko vmesniki samo javni dostop.
Spremenljivke: abstraktni razred ima lahko spremenljivke člane, vmesnik pa ne.
Če povzamemo, se abstraktni razredi uporabljajo za zagotavljanje osnovnega razreda za konkretne podrazrede, ki jih dedujejo, medtem ko se vmesniki uporabljajo za definiranje nabora metod, ki jih mora razred izvajati. Abstraktni razredi imajo lahko implementirane in abstraktne metode, vmesniki pa samo abstraktne metode. Razredi lahko podedujejo samo en abstraktni razred, lahko pa izvajajo več vmesnikov.
Kot vemo, se abstrakcija nanaša na skrivanje notranje izvedbe funkcije in samo prikazovanje funkcionalnosti uporabnikom. tj. prikaz le zahtevanih funkcij in skrivanje, kako se te funkcije izvajajo v ozadju. Medtem ko je vmesnik še en način za doseganje abstrakcije v Javi. Oboje abstraktni razred in vmesnik se uporabljajo za abstrakcijo, sta odslej vmesnik in abstraktni razred zahtevana predpogoja.

Abstraktni razred proti vmesniku
- Vrsta metod: Vmesnik ima lahko samo abstraktne metode. Medtem ko ima lahko abstraktni razred abstraktno metodo in konkretne metode. Od Jave 8 ima lahko tudi privzete in statične metode. Od Jave 9 ima lahko tudi zasebne konkretne metode.
- Opomba: Konkretne metode so tiste metode, ki imajo svojo popolno definicijo, vendar jih je mogoče tudi preglasiti v podedovanem razredu. Če pa naredimo konkretno metodo kot KONČNO ni ga mogoče preglasiti v podedovanem razredu, ker deklaracija metode kot končne pomeni – njegova izvedba je končana .
- Končne spremenljivke: Spremenljivke, deklarirane v vmesniku Java, so privzeto končne. Abstraktni razred lahko vsebuje nekončne spremenljivke.
- Vrsta spremenljivk: Abstraktni razred ima lahko končne, nekončne, statične in nestatične spremenljivke. Vmesnik ima samo statične in končne spremenljivke.
- Izvedba: Abstraktni razred lahko zagotovi izvedbo vmesnika. Vmesnik ne more zagotoviti implementacije abstraktnega razreda.
- Dedovanje proti abstrakciji: Vmesnik Java je mogoče implementirati s ključno besedo pripomočke in abstraktni razred je mogoče razširiti s ključno besedo se razteza .
- Več izvedb: Vmesnik lahko razširi enega ali več vmesnikov Java; abstraktni razred lahko razširi drug razred Java in implementira več vmesnikov Java.
- Večkratno dedovanje: Večkratno dedovanje je mogoče delno doseči z uporabo vmesnikov, medtem ko tega ni mogoče storiti z uporabo abstraktnih razredov. Ker lahko v Javi en razred izvaja več vmesnikov, vendar se en razred ne more razširiti iz več drugih razredov, ker to preprosto ni mogoče v Javi, saj bi to vodilo do težave z diamanti.
- Dostopnost članov podatkov: Člani (spremenljivke) vmesnika Java so privzeto končni. Abstraktni razred Java ima lahko člane razreda, kot so zasebni, zaščiteni itd.
Značilnosti abstraktnega razreda: -
Abstraktni razred je posebna vrsta razreda v objektno usmerjenem programiranju, ki ga ni mogoče neposredno instancirati. Namesto tega služi kot načrt ali predloga za izpeljavo drugih razredov. Abstraktni razred:
- Ni mogoče ustvariti : Abstraktnih razredov ni mogoče neposredno instancirati, kar pomeni, da ne morete ustvariti objektov abstraktnega razreda.
- Vsebuje vsaj eno čisto virtualno funkcijo : Abstraktni razredi morajo vsebovati vsaj eno čisto virtualno funkcijo, kar pomeni, da funkcija nima implementacije in jo morajo implementirati kateri koli izpeljani razredi.
- Lahko vsebuje abstraktne in neabstraktne metode : Abstraktni razredi imajo lahko abstraktne in neabstraktne metode. Neabstraktne metode imajo popolno izvedbo in jih je mogoče klicati neposredno.
- Lahko ima konstruktorje in destruktorje : Abstraktni razredi imajo lahko konstruktorje in destruktorje kot kateri koli drug razred.
- Lahko ima spremenljivke člane : Abstraktni razredi imajo lahko spremenljivke člane, ki so spremenljivke, ki pripadajo objektu razreda.
- Lahko se uporablja kot osnovni razred : Abstraktne razrede je mogoče uporabiti kot osnovni razred za druge razrede, kar pomeni, da jih lahko podedujejo drugi razredi.
Na splošno se abstraktni razredi uporabljajo za definiranje skupnega vmesnika ali vedenja, ki si ga lahko deli več povezanih razredov, vendar s posebnimi implementacijami v vsakem izpeljanem razredu.
Primer 1: (za abstraktni razred)
Java abstract class sunstar { abstract void printInfo(); } class employee extends sunstar { void printInfo() { String name = 'avinash'; int age = 21; float salary = 222.2F; System.out.println(name); System.out.println(age); System.out.println(salary); } } class base { public static void main(String args[]) { sunstar s = new employee(); s.printInfo(); } }> Izhod
avinash 21 222.2>
Primer 2: (za abstraktni razred)
Java // Java Program to Illustrate Concept of // Abstract Class // Importing required classes import java.io.*; // Class 1 // Helper abstract class abstract class Shape { // Declare fields String objectName = ' '; // Constructor of this class Shape(String name) { this.objectName = name; } // Method // Non-abstract methods // Having as default implementation public void moveTo(int x, int y) { System.out.println(this.objectName + ' ' + 'has been moved to' + ' x = ' + x + ' and y = ' + y); } // Method 2 // Abstract methods which will be // implemented by its subclass(es) abstract public double area(); abstract public void draw(); } // Class 2 // Helper class extending Class 1 class Rectangle extends Shape { // Attributes of rectangle int length, width; // Constructor Rectangle(int length, int width, String name) { // Super keyword refers to current instance itself super(name); // this keyword refers to current instance itself this.length = length; this.width = width; } // Method 1 // To draw rectangle @Override public void draw() { System.out.println('Rectangle has been drawn '); } // Method 2 // To compute rectangle area @Override public double area() { // Length * Breadth return (double)(length * width); } } // Class 3 // Helper class extending Class 1 class Circle extends Shape { // Attributes of a Circle double pi = 3.14; int radius; // Constructor Circle(int radius, String name) { // Super keyword refers to parent class super(name); // This keyword refers to current instance itself this.radius = radius; } // Method 1 // To draw circle @Override public void draw() { // Print statement System.out.println('Circle has been drawn '); } // Method 2 // To compute circle area @Override public double area() { return (double)((pi * radius * radius)); } } // Class 4 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating the Object of Rectangle class // and using shape class reference. Shape rect = new Rectangle(2, 3, 'Rectangle'); System.out.println('Area of rectangle: ' + rect.area()); rect.moveTo(1, 2); System.out.println(' '); // Creating the Objects of circle class Shape circle = new Circle(2, 'Circle'); System.out.println('Area of circle: ' + circle.area()); circle.moveTo(2, 4); } }> Izhod
Area of rectangle: 6.0 Rectangle has been moved to x = 1 and y = 2 Area of circle: 12.56 Circle has been moved to x = 2 and y = 4>
Kaj pa, če nimamo skupne kode med pravokotnikom in krogom, potem uporabimo vmesnik.
Vmesnik:
Lastnosti vmesnika:
Vmesnik:
dodajanje nizov java
- Definira nabor metod in lastnosti: Vmesnik definira nabor metod in lastnosti, ki jih mora implementirati kateri koli razred ali struktura, ki implementira vmesnik.
- Zagotavlja skupni protokol: Vmesniki zagotavljajo skupni protokol, ki omogoča medsebojno komunikacijo različnih komponent programske opreme.
- Podpira polimorfizem: Vmesnik se lahko uporablja za doseganje polimorfizma, kar pomeni, da se objekti različnih razredov lahko obravnavajo, kot da pripadajo istemu tipu, če izvajajo isti vmesnik.
- Omogoča ločevanje skrbi: Vmesniki omogočajo ločevanje pomislekov, kar pomeni, da se lahko različni deli programskega sistema razvijajo neodvisno drug od drugega, če le upoštevajo specifikacije vmesnika.
- Izboljša možnost ponovne uporabe kode: Vmesniki izboljšujejo ponovno uporabnost kode tako, da omogočajo različnim komponentam programske opreme, da ponovno uporabijo isto bazo kode, če le izvajajo isti vmesnik.
- Uveljavlja vzorce oblikovanja: Vmesnike je mogoče uporabiti za uveljavljanje oblikovalskih vzorcev, kot je vzorec adapterja, tako da zahtevajo, da izvajalski razredi izvajajo določene metode ali lastnosti.
- Olajša testiranje: Vmesniki olajšajo testiranje tako, da omogočajo testiranje komponent programske opreme neodvisno druga od druge z uporabo lažnih objektov, ki implementirajo vmesnik.
Primer 1: Za vmesnik
Java // Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape { // Abstract method void draw(); double area(); } // Class 1 // Helper class class Rectangle implements Shape { int length, width; // constructor Rectangle(int length, int width) { this.length = length; this.width = width; } @Override public void draw() { System.out.println('Rectangle has been drawn '); } @Override public double area() { return (double)(length * width); } } // Class 2 // Helper class class Circle implements Shape { double pi = 3.14; int radius; // constructor Circle(int radius) { this.radius = radius; } @Override public void draw() { System.out.println('Circle has been drawn '); } @Override public double area() { return (double)((pi * radius * radius)); } } // Class 3 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating the Object of Rectangle class // and using shape interface reference. Shape rect = new Rectangle(2, 3); System.out.println('Area of rectangle: ' + rect.area()); // Creating the Objects of circle class Shape circle = new Circle(2); System.out.println('Area of circle: ' + circle.area()); } }> Izhod
Area of rectangle: 6.0 Area of circle: 12.56>
Primer 2: Za vmesnik
Java // Java Program to Illustrate Concept of Interface // Importing I/O classes import java.io.*; // Interface interface Shape { // Abstract method void draw(); double area(); } // Class 1 // Helper class class Rectangle implements Shape { int length, width; // constructor Rectangle(int length, int width) { this.length = length; this.width = width; } @Override public void draw() { System.out.println('Rectangle has been drawn '); } @Override public double area() { return (double)(length * width); } } // Class 2 // Helper class class Circle implements Shape { double pi = 3.14; int radius; // constructor Circle(int radius) { this.radius = radius; } @Override public void draw() { System.out.println('Circle has been drawn '); } @Override public double area() { return (double)((pi * radius * radius)); } } // Class 3 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating the Object of Rectangle class // and using shape interface reference. Shape rect = new Rectangle(2, 3); System.out.println('Area of rectangle: ' + rect.area()); // Creating the Objects of circle class Shape circle = new Circle(2); System.out.println('Area of circle: ' + circle.area()); } }> Izhod
Area of rectangle: 6.0 Area of circle: 12.56>
Kdaj kaj uporabiti?
Razmislite o uporabi abstraktnih razredov, če katera od teh izjav velja za vašo situacijo:
- V aplikaciji Java je nekaj sorodnih razredov, ki morajo deliti nekaj vrstic kode, nato pa lahko te vrstice kode postavite znotraj abstraktnega razreda in ta abstraktni razred bi morali razširiti vsi ti sorodni razredi.
- Definirate lahko nestatična ali nekončna polja v abstraktnem razredu, tako da lahko prek metode dostopate in spreminjate stanje predmeta, ki mu pripadajo.
- Pričakujete lahko, da imajo razredi, ki razširjajo abstraktni razred, veliko skupnih metod ali polj ali da zahtevajo modifikatorje dostopa, ki niso javni (kot sta zaščiteno in zasebno).
Razmislite o uporabi vmesnikov, če katera od teh izjav velja za vašo situacijo:
- To je popolna abstrakcija, vse metode, deklarirane znotraj vmesnika, morajo biti implementirane v razredu(-ih), ki implementira ta vmesnik.
- Razred lahko izvaja več kot en vmesnik. Imenuje se večkratno dedovanje.
- Določiti želite vedenje določene vrste podatkov, vendar vas ne skrbi, kdo izvaja njegovo vedenje.