logo

Atšķirība starp abstrakto klasi un interfeisu Java

Abstraktā klase un interfeiss tiek izmantoti, lai definētu līgumus objektorientētā programmēšanā, taču starp tām ir dažas galvenās atšķirības.

Atšķirība starp abstrakto klasi un interfeisu: -



Definīcija: Abstraktā klase ir klase, kuru nevar izveidot un var ietvert gan abstraktas, gan neabstraktas metodes. No otras puses, saskarne ir līgums, kas nosaka metožu kopu, kas klasei jāīsteno.

int uz virkni konvertēšanu java

Metodes ieviešana: Abstraktā klasē dažas metodes var ieviest, bet citas ir atstātas abstraktas, kas nozīmē, ka tām nav ieviešanas un tās ir jāaizvieto ar konkrētām apakšklasēm. Turpretim visas saskarnes metodes pēc noklusējuma ir abstraktas, un tās ir jāievieš jebkurai klasei, kas ievieš saskarni.

Mantojums: klase var mantot tikai no vienas abstraktas klases, taču tā var ieviest vairākas saskarnes. Tas ir tāpēc, ka abstraktā klase apzīmē objekta veidu, savukārt saskarne ir uzvedības kopa.



Piekļuves modifikatori: abstraktajām klasēm to metodēm un īpašībām var būt piekļuves modifikatori, piemēram, publiski, aizsargāti un privāti, savukārt saskarnēm var būt tikai publiska piekļuve.

Mainīgie: abstraktai klasei var būt dalībnieku mainīgie, bet saskarnē to nevar.

Rezumējot, abstraktās klases tiek izmantotas, lai nodrošinātu pamatklasi konkrētām apakšklasēm, no kurām tās mantot, savukārt saskarnes tiek izmantotas, lai definētu metožu kopu, kas klasei jāīsteno. Abstraktajās klasēs var būt ieviestas un abstraktas metodes, savukārt saskarnēm var būt tikai abstraktas metodes. Klases var mantot tikai no vienas abstraktas klases, bet var ieviest vairākas saskarnes.



Kā mēs zinām, abstrakcija attiecas uz funkcijas iekšējās ieviešanas slēpšanu un tikai funkcionalitātes parādīšanu lietotājiem. t.i., tiek rādītas tikai nepieciešamās funkcijas un tiek slēpts, kā šīs funkcijas tiek ieviestas aizkulisēs. Tā kā interfeiss ir vēl viens veids, kā panākt abstrakciju Java. Abi abstraktā klase un saskarne tiek izmantoti abstrakcijai, turpmāk Interfeiss un Abstract Class ir nepieciešami priekšnosacījumi.

Abstraktā klase pret interfeisu

Abstraktā klase pret interfeisu

  • Metožu veidi: Interfeisam var būt tikai abstraktas metodes. Tā kā abstraktai klasei var būt abstrakta metode un konkrētas metodes. Sākot ar Java 8, tai var būt arī noklusējuma un statiskās metodes. Sākot ar Java 9, tai var būt arī privātas konkrētas metodes.
  • Piezīme: Konkrētās metodes ir tās metodes, kurām ir pilnīga definīcija, taču tās var arī ignorēt mantotajā klasē. Tomēr, ja mēs izgatavojam konkrētu metodi kā FINĀLS to nevar ignorēt mantotajā klasē, jo metodes deklarēšana kā galīgais līdzeklis - tā īstenošana ir pabeigta .
  • Galīgie mainīgie: Java saskarnē deklarētie mainīgie pēc noklusējuma ir galīgi. Abstraktā klasē var būt mainīgie, kas nav galīgi.
  • Mainīgo veids: Abstraktajā klasē var būt galīgie, negalīgie, statiskie un nestatiskie mainīgie. Interfeisam ir tikai statiski un galīgie mainīgie.
  • Īstenošana: Abstraktā klase var nodrošināt interfeisa ieviešanu. Interfeiss nevar nodrošināt abstraktas klases ieviešanu.
  • Mantojums pret abstrakciju: Java saskarni var ieviest, izmantojot atslēgvārdu īsteno un abstraktu klasi var paplašināt, izmantojot atslēgvārdu pagarina .
  • Vairākas ieviešanas iespējas: Saskarne var paplašināt vienu vai vairākas Java saskarnes; abstraktā klase var paplašināt citu Java klasi un ieviest vairākas Java saskarnes.
  • Daudzkārtēja mantošana: Vairāku pārmantošanu daļēji var panākt, izmantojot saskarnes, savukārt to pašu nevar panākt, izmantojot abstraktas klases. Tā kā Java valodā viena klase var ieviest vairākas saskarnes, bet viena klase nevar paplašināties no vairākām citām klasēm, jo ​​java tas vienkārši nav iespējams, jo tas izraisītu dimanta problēmu.
  • Datu dalībnieku pieejamība: Java interfeisa dalībnieki (mainīgie) pēc noklusējuma ir galīgi. Java abstraktajā klasē var būt tādi klases dalībnieki kā privāts, aizsargāts utt.

Abstraktās klases iezīmes: -

Abstraktā klase ir īpašs klases veids objektorientētā programmēšanā, kuru nevar tieši izveidot. Tā vietā tas kalpo kā projekts vai veidne citām klasēm, no kurām var iegūt. Abstrakta klase:

  1. Nevar izveidot momentu : Abstraktās klases nevar tieši izveidot, kas nozīmē, ka nevar izveidot abstraktas klases objektus.
  2. Satur vismaz vienu virtuālu funkciju : Abstraktajās klasēs ir jāietver vismaz viena tīra virtuāla funkcija, kas nozīmē, ka funkcijai nav ieviešanas un tā ir jārealizē jebkurām atvasinātajām klasēm.
  3. Var saturēt gan abstraktas, gan neabstraktas metodes : Abstraktajām klasēm var būt gan abstraktas, gan neabstraktas metodes. Neabstraktām metodēm ir pilnīga ieviešana, un tās var izsaukt tieši.
  4. Var būt konstruktori un iznīcinātāji : Abstraktajām klasēm tāpat kā jebkurai citai klasei var būt konstruktori un destruktori.
  5. Var būt dalībnieku mainīgie : Abstraktajās klasēs var būt dalībnieku mainīgie, kas ir mainīgie, kas pieder klases objektam.
  6. Var izmantot kā bāzes klasi : Abstraktās klases var izmantot kā bāzes klasi citām klasēm, kas nozīmē, ka tās var mantot citas klases.

Kopumā abstraktās klases tiek izmantotas, lai definētu kopīgu saskarni vai uzvedību, ko var koplietot vairākas saistītās klases, bet ar īpašām implementācijām katrā atvasinātajā klasē.

1. piemērs: (abstraktajai klasei)

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();  } }>

Izvade
avinash 21 222.2>

2. piemērs: (abstraktajai klasei)

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);  } }>

Izvade
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>

Ko darīt, ja mums nav kopīga koda starp taisnstūri un apli, tad izmantojiet saskarni.

Interfeiss:

Interfeisa īpašības:

Interfeiss:

  1. Definē metožu un īpašību kopu: Interfeiss definē metožu un rekvizītu kopu, kas jāīsteno jebkurai klasei vai struktūrai, kas ievieš saskarni.
  2. Nodrošina kopīgu protokolu: Saskarnes nodrošina kopīgu protokolu, kas ļauj dažādiem programmatūras komponentiem sazināties vienam ar otru.
  3. Atbalsta polimorfismu: Lai panāktu polimorfismu, var izmantot saskarni, kas nozīmē, ka dažādu klašu objektus var uzskatīt tā, it kā tie piederētu vienam un tam pašam tipam, ja vien tie īsteno vienu un to pašu interfeisu.
  4. Ļauj nodalīt bažas: Saskarnes ļauj nodalīt problēmas, kas nozīmē, ka dažādas programmatūras sistēmas daļas var izstrādāt neatkarīgi viena no otras, ja vien tās atbilst saskarnes specifikācijām.
  5. Uzlabo koda atkārtotu izmantošanu: Saskarnes uzlabo koda atkārtotu izmantojamību, ļaujot dažādiem programmatūras komponentiem atkārtoti izmantot vienu un to pašu koda bāzi, ja vien tie ievieš vienu un to pašu interfeisu.
  6. Ievieš dizaina modeļus: Saskarnes var izmantot, lai ieviestu dizaina modeļus, piemēram, adaptera modeli, pieprasot, lai ieviešanas klasēs tiktu ieviestas noteiktas metodes vai īpašības.
  7. Atvieglo testēšanu: Saskarnes atvieglo testēšanu, ļaujot programmatūras komponentus pārbaudīt neatkarīgi vienu no otra, izmantojot imitācijas objektus, kas ievieš saskarni.

1. piemērs: Interfeisam

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());  } }>

Izvade
Area of rectangle: 6.0 Area of circle: 12.56>

2. piemērs: Interfeisam

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());  } }>

Izvade
Area of rectangle: 6.0 Area of circle: 12.56>

Kad ko lietot?

Apsveriet iespēju izmantot abstraktas klases, ja kāds no šiem apgalvojumiem attiecas uz jūsu situāciju:

  • Java lietojumprogrammā ir dažas saistītas klases, kurām ir jākoplieto dažas koda rindas, tad šīs koda rindas varat ievietot abstraktajā klasē, un šī abstraktā klase ir jāpaplašina ar visām šīm saistītajām klasēm.
  • Abstraktajā klasē varat definēt nestatisko vai galīgo lauku(-us), lai, izmantojot metodi, varētu piekļūt un mainīt tā objekta stāvokli, kuram tie pieder.
  • Varat sagaidīt, ka klasēm, kas paplašina abstraktu klasi, ir daudz kopīgu metožu vai lauku, vai arī ir nepieciešami piekļuves modifikatori, kas nav publiski (piemēram, aizsargāti un privāti).

Apsveriet iespēju izmantot saskarnes, ja kāds no šiem apgalvojumiem attiecas uz jūsu situāciju:

abstraktajai klasei var būt konstruktors
  • Tā ir pilnīga abstrakcija, visas saskarnē deklarētās metodes ir jāīsteno klasei(-ēm), kas ievieš šo saskarni.
  • Klase var ieviest vairāk nekā vienu saskarni. To sauc par vairākkārtēju mantojumu.
  • Jūs vēlaties norādīt konkrēta datu tipa uzvedību, taču neuztraucaties par to, kurš ieviesīs tā darbību.