I Java deklareras abstrakt klass med nyckelordet abstrakt. Det kan ha både abstrakta och icke-abstrakta metoder (metoder med kroppar). En abstrakt är en Java-modifierare som är tillämplig för klasser och metoder i Java men inte för variabler . I den här artikeln kommer vi att lära oss användningen av abstrakta klasser i Java.
Vad är abstrakt klass i Java?
Java abstrakt klass är en klass som inte kan initieras av sig själv, den måste underklassas av en annan klass för att kunna använda dess egenskaper. En abstrakt klass deklareras med hjälp av nyckelordet abstrakt i dess klassdefinition.
Illustration av abstrakt klass
abstract class Shape { int color; // An abstract function abstract void draw(); }>
I Java, följande några viktiga iakttagelser om abstrakta klasser är följande:
- En instans av en abstrakt klass kan inte skapas.
- Konstruktörer är tillåtna.
- Vi kan ha en abstrakt klass utan någon abstrakt metod.
- Det kan finnas en slutlig metod i abstrakt klass men vilken abstrakt metod som helst i klass (abstrakt klass) kan inte deklareras som slutlig eller i enklare termer kan slutmetoden inte vara abstrakt i sig eftersom den kommer att ge ett fel: Olaglig kombination av modifierare: abstrakt och slutlig
- Vi kan definiera statiska metoder i en abstrakt klass
- Vi kan använda abstrakt nyckelord för att deklarera toppklasser (Ytterklass) samt inre klasser som abstrakt
- Om en klass innehåller åtminstone en abstrakt metod då bör obligatorisk deklarera en klass som abstrakt
- Om Barnklass är oförmögen att implementera alla abstrakta metoder för Föräldraklass då borde vi deklarera det Barnklass som abstrakt så att nästa nivå Child-klassen ska ge implementering till den återstående abstrakta metoden
Exempel på Java Abstract Class
1. Exempel på abstrakt klass som har abstrakt metod
Nedan är implementeringen av ovanstående ämne:
Java
// Abstract class> abstract> class> Sunstar {> > abstract> void> printInfo();> }> // Abstraction performed using extends> 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);> > }> }> // Base class> class> Base {> > public> static> void> main(String args[])> > {> > Sunstar s => new> Employee();> > s.printInfo();> > }> }> |
>
>Produktion
avinash 21 222.2>
2. Abstrakt klass med konstruktor, datamedlem och metoder
Element abstrakt klass kan ha
- datamedlem
- abstrakt metod
- metodtext (icke-abstrakt metod)
- konstruktör
- main() metod.
Nedan är implementeringen av ovanstående ämne:
Java
// Java Program to implement Abstract Class> // having constructor, data member, and methods> import> java.io.*;> abstract> class> Subject {> > Subject() {> > System.out.println(> 'Learning Subject'> );> > }> > > abstract> void> syllabus();> > > void> Learn(){> > System.out.println(> 'Preparing Right Now!'> );> > }> }> class> IT> extends> Subject {> > void> syllabus(){> > System.out.println(> 'C , Java , C++'> );> > }> }> class> GFG {> > public> static> void> main(String[] args) {> > Subject x=> new> IT();> > > x.syllabus();> > x.Learn();> > }> }> |
>
>Produktion
Learning Subject C , Java , C++ Preparing Right Now!>
Egenskaper för abstrakt klass
Låt oss utveckla dessa observationer och motivera dem med hjälp av rena java-program enligt följande.
Observation 1
I Java, precis som i C++, kan en instans av en abstrakt klass inte skapas, vi kan dock ha referenser till abstrakt klasstyp. Det är som visas nedan via det rena Java-programmet.
Exempel
Java
// Java Program to Illustrate> // that an instance of Abstract> // Class can not be created> // Class 1> // Abstract class> abstract> class> Base {> > abstract> void> fun();> }> // Class 2> class> Derived> extends> Base {> > void> fun()> > {> > System.out.println(> 'Derived fun() called'> );> > }> }> // Class 3> // Main class> class> Main {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Uncommenting the following line will cause> > // compiler error as the line tries to create an> > // instance of abstract class. Base b = new Base();> > // We can have references of Base type.> > Base b => new> Derived();> > b.fun();> > }> }> |
>
>Produktion
hur man konverterar sträng till heltal
Derived fun() called>
Observation 2
Som C++, an abstrakt klass kan innehålla konstruktörer i Java. Och en konstruktor av en abstrakt klass anropas när en instans av en ärvd klass skapas. Det är som visas i programmet nedan enligt följande:
Exempel:
Java
// Java Program to Illustrate Abstract Class> // Can contain Constructors> // Class 1> // Abstract class> abstract> class> Base {> > // Constructor of class 1> > Base()> > {> > // Print statement> > System.out.println(> 'Base Constructor Called'> );> > }> > // Abstract method inside class1> > abstract> void> fun();> }> // Class 2> class> Derived> extends> Base {> > // Constructor of class2> > Derived()> > {> > System.out.println(> 'Derived Constructor Called'> );> > }> > // Method of class2> > void> fun()> > {> > System.out.println(> 'Derived fun() called'> );> > }> }> // Class 3> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Creating object of class 2> > // inside main() method> > Derived d => new> Derived();> > d.fun();> > }> }> |
>
>Produktion
Base Constructor Called Derived Constructor Called Derived fun() called>
Observation 3
I Java kan vi ha en abstrakt klass utan någon abstrakt metod . Detta tillåter oss att skapa klasser som inte kan instansieras utan bara kan ärvas . Det är som visas nedan enligt följande med hjälp av ett rent java-program.
Exempel:
Java
// Java Program to illustrate Abstract class> // Without any abstract method> // Class 1> // An abstract class without any abstract method> abstract> class> Base {> > // Demo method. This is not an abstract method.> > void> fun()> > {> > // Print message if class 1 function is called> > System.out.println(> > 'Function of Base class is called'> );> > }> }> // Class 2> class> Derived> extends> Base {> > // This class only inherits the Base class methods and> > // properties> }> // Class 3> class> Main {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Creating object of class 2> > Derived d => new> Derived();> > // Calling function defined in class 1 inside main()> > // with object of class 2 inside main() method> > d.fun();> > }> }> |
>
>Produktion
Function of Base class is called>
Observation 4
Abstrakta klasser kan också ha slutlig metoder (metoder som inte kan åsidosättas)
Exempel:
Java
// Java Program to Illustrate Abstract classes> // Can also have Final Methods> // Class 1> // Abstract class> abstract> class> Base {> > final> void> fun()> > {> > System.out.println(> 'Base fun() called'> );> > }> }> // Class 2> class> Derived> extends> Base {> > }> // Class 3> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > {> > // Creating object of abstract class> > Base b => new> Derived();> > // Calling method on object created above> > // inside main method> > b.fun();> > }> > }> }> |
>
>Produktion
java exempelkod
Base fun() called>
Observation 5
För någon abstrakt java-klass får vi inte skapa ett objekt, dvs för en abstrakt klass är instansiering inte möjlig.
Java
// Java Program to Illustrate Abstract Class> // Main class> // An abstract class> abstract> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Trying to create an object> > GFG gfg => new> GFG();> > }> }> |
>
>
Produktion:
Observation 6
Liknar gränssnittet vi kan definiera statiska metoder i en abstrakt klass den där kan anropas oberoende utan objekt.
Java
// Java Program to Illustrate> // Static Methods in Abstract> // Class Can be called Independently> // Class 1> // Abstract class> abstract> class> Helper {> > // Abstract method> > static> void> demofun()> > {> > // Print statement> > System.out.println(> 'Geeks for Geeks'> );> > }> }> // Class 2> // Main class extending Helper class> public> class> GFG> extends> Helper {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Calling method inside main()> > // as defined in above class> > Helper.demofun();> > }> }> |
>
>Produktion
Geeks for Geeks>
Observation 7
Vi kan använda abstrakt nyckelord för att deklarera toppklasser (Ytre klass) såväl som inre klasser som abstrakta
Java
import> java.io.*;> abstract> class> B {> > // declaring inner class as abstract with abstract> > // method> > abstract> class> C {> > abstract> void> myAbstractMethod();> > }> }> class> D> extends> B {> > class> E> extends> C {> > // implementing the abstract method> > void> myAbstractMethod()> > {> > System.out.println(> > 'Inside abstract method implementation'> );> > }> > }> }> public> class> Main {> > public> static> void> main(String args[])> > {> > // Instantiating the outer class> > D outer => new> D();> > // Instantiating the inner class> > D.E inner = outer.> new> E();> > inner.myAbstractMethod();> > }> }> |
>
>Produktion
Inside abstract method implementation>
Observation 8
Om en klass innehåller minst en abstrakt metod sedan obligatoriskt att vi ska deklarera klassen som abstrakt annars kommer vi att få ett kompileringsfel ,Om en klass innehåller minst en abstrakt metod är implementeringen inte komplett för den klassen, och därför rekommenderas det inte att skapa ett objekt för att begränsa objektskapandet för sådana partiella klasser vi använder abstrakt nyckelord.
Java
/*package whatever //do not write package name here */> import> java.io.*;> // here if we remove the abstract> // keyword then we will get compile> // time error due to abstract method> abstract> class> Demo {> > abstract> void> m1();> }> class> Child> extends> Demo {> > public> void> m1()> > {> > System.out.print(> 'Hello'> );> > }> }> class> GFG {> > public> static> void> main(String[] args)> > {> > Child c => new> Child();> > c.m1();> > }> }> |
>
>Produktion
Hello>
Observation 9
Om Barn klass inte kan tillhandahålla implementering till alla abstrakta metoder i klassen Parent, då bör vi förklara den Child-klassen som abstrakt så att nästa nivå Child-klassen ska ge implementering till den återstående abstrakta metoden.
Java
// Java Program to demonstrate> // Observation> import> java.io.*;> abstract> class> Demo {> > abstract> void> m1();> > abstract> void> m2();> > abstract> void> m3();> }> abstract> class> FirstChild> extends> Demo {> > public> void> m1() {> > System.out.println(> 'Inside m1'> );> > }> }> class> SecondChild> extends> FirstChild {> > public> void> m2() {> > System.out.println(> 'Inside m2'> );> > }> > public> void> m3() {> > System.out.println(> 'Inside m3'> );> > }> }> class> GFG {> > public> static> void> main(String[] args)> > {> > // if we remove the abstract keyword from FirstChild> > // Class and uncommented below obj creation for> > // FirstChild then it will throw> > // compile time error as did't override all the> > // abstract methods> > // FirstChild f=new FirstChild();> > // f.m1();> > SecondChild s => new> SecondChild();> > s.m1();> > s.m2();> > s.m3();> > }> }> |
>
>Produktion
Inside m1 Inside m2 Inside m3>
I C++, om en klass har minst en ren virtuell funktion , då blir klassen abstrakt. Till skillnad från C++ används i Java ett separat nyckelord abstrakt för att göra en klassabstrakt.
Slutsats
Punkter att komma ihåg från den här artikeln nämns nedan:
- En abstrakt klass är en klass som inte kan initieras av sig själv, den måste underklassas av en annan klass för att kunna använda dess egenskaper.
- En abstrakt klass kan skapas med hjälp av abstrakta nyckelord.
- Vi kan ha en abstrakt klass utan någon abstrakt metod.
Vanliga frågor om abstrakt klass
1. Vad är en abstrakt klass i Java?
En abstrakt klass i Java är en klass som inte kan initieras på egen hand utan kan användas som en underklass av en annan klass.
2. Vad är syftet med den abstrakta klassen?
Huvudsyftet med den abstrakta klassen är att skapa en basklass från vilken många andra klasser kan härledas.
3. Vilken är den största fördelen med abstrakt klass?
En abstrakt klass tillhandahåller data som gömmer sig i Java.
4. Varför abstrakt klass är snabbare än gränssnitt?
En abstrakt klass är snabbare än ett gränssnitt eftersom gränssnittet involverar en sökning innan någon åsidosatt metod anropas i Java medan abstrakt klass kan användas direkt.
Läs också
- Skillnaden mellan abstrakt klass och gränssnitt i Java
- Skillnaden mellan abstrakt klass och abstrakta metoder
- Konstruktörer i Java Abstrakt klass