У Java абстрактний клас оголошується за допомогою ключового слова abstract. Він може мати як абстрактні, так і неабстрактні методи (методи з тілами). Анотація — це модифікатор Java, застосовний для класів і методів у Java, але не для змінних . У цій статті ми навчимося використовувати абстрактні класи в Java.
Що таке абстрактний клас у Java?
Абстрактний клас Java — це клас, який не може бути ініційований сам по собі, він повинен бути підкласом іншого класу, щоб використовувати його властивості. Абстрактний клас оголошується за допомогою ключового слова abstract у його визначенні класу.
Ілюстрація абстрактного класу
abstract class Shape { int color; // An abstract function abstract void draw(); }>
У Java наступні деякі важливі спостереження про абстрактні класи такі:
- Неможливо створити екземпляр абстрактного класу.
- Допускаються конструктори.
- Ми можемо мати абстрактний клас без жодного абстрактного методу.
- Може бути a кінцевий спосіб в абстрактному класі, але будь-який абстрактний метод у класі (абстрактний клас) не може бути оголошений як остаточний або, простіше кажучи, кінцевий метод не може бути абстрактним, оскільки це призведе до помилки: Неприпустима комбінація модифікаторів: abstract і final
- Ми можемо визначити статичні методи в абстрактному класі
- Ми можемо використовувати абстрактне ключове слово для декларування класи верхнього рівня (зовнішній клас), а також внутрішні класи як реферат
- Якщо клас містить принаймні один абстрактний метод тоді обов’язково слід оголосити клас як абстрактний
- Якщо Дитячий клас не в змозі забезпечити реалізацію всіх абстрактних методів Батьківський клас тоді ми повинні це оголосити Дочірній клас як абстрактний так що наступний клас Child має забезпечити реалізацію решти абстрактного методу
Приклади абстрактного класу Java
1. Приклад абстрактного класу, який має абстрактний метод
Нижче наведено реалізацію вищезазначеної теми:
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();> > }> }> |
>
>Вихід
avinash 21 222.2>
2. Абстрактний клас, що має конструктор, член даних і методи
Елементи, які може мати абстрактний клас
- член даних
- абстрактний метод
- тіло методу (неабстрактний метод)
- конструктор
- метод main().
Нижче наведено реалізацію вищезазначеної теми:
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();> > }> }> |
>
>Вихід
Learning Subject C , Java , C++ Preparing Right Now!>
Властивості абстрактного класу
Давайте докладніше розглянемо ці спостереження та обґрунтуємо їх за допомогою чистих програм Java, як описано нижче.
Спостереження 1
У Java, як і в C++, екземпляр абстрактного класу не може бути створений, однак ми можемо мати посилання на тип абстрактного класу. Це показано нижче за допомогою чистої програми Java.
приклад
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();> > }> }> |
>
>Вихід
як відключити режим розробника на android
Derived fun() called>
Спостереження 2
Як C++, an абстрактний клас може містити конструктори на Java. А конструктор абстрактного класу викликається, коли створюється екземпляр успадкованого класу. У наведеній нижче програмі це виглядає так:
приклад:
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();> > }> }> |
>
>Вихід
Base Constructor Called Derived Constructor Called Derived fun() called>
Спостереження 3
У Java ми можемо мати абстрактний клас без жодного абстрактного методу . Це дозволяє нам створювати класи, які не можуть бути створені, але можуть бути лише успадковані . Це показано нижче за допомогою чистої програми Java.
приклад:
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();> > }> }> |
>
>Вихід
Function of Base class is called>
Спостереження 4
Абстрактні класи також можуть мати остаточний методи (методи, які не можна перевизначити)
приклад:
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();> > }> > }> }> |
>
весняний черевик
>Вихід
Base fun() called>
Спостереження 5
Для будь-якого абстрактного класу Java нам не дозволено створювати об’єкт, тобто створення екземпляра абстрактного класу неможливе.
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();> > }> }> |
>
>
Вихід:
Спостереження 6
Схожий на інтерфейс ми можемо визначити статичні методи в абстрактному класі що можна викликати незалежно без об'єкта.
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();> > }> }> |
>
>Вихід
Geeks for Geeks>
Спостереження 7
Ми можемо використовувати абстрактне ключове слово для оголошення класів верхнього рівня (зовнішнього класу), а також внутрішніх класів як абстрактних
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();> > }> }> |
>
>Вихід
Inside abstract method implementation>
Спостереження 8
Якщо клас містить принаймні один абстрактний метод потім обов’язково, що ми повинні оголосити клас як абстрактний інакше ми отримаємо помилку під час компіляції. Якщо клас містить принаймні один абстрактний метод, тоді реалізація для цього класу не завершена, і, отже, не рекомендується створювати об’єкт, щоб обмежити створення об’єктів для таких часткових класів ми використовуємо абстрактне ключове слово.
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();> > }> }> |
>
>Вихід
Hello>
Спостереження 9
Якщо дитина клас не може забезпечити реалізацію для всіх абстрактних методів батьківського класу, тоді ми повинні оголосити цей клас Child як абстрактний, щоб наступний клас Child мав забезпечити реалізацію решти абстрактного методу.
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();> > }> }> |
>
>Вихід
Inside m1 Inside m2 Inside m3>
У C++, якщо клас має принаймні один чиста віртуальна функція , тоді клас стає абстрактним. На відміну від C++, у Java для створення анотації класу використовується окреме ключове слово abstract.
Висновок
Пункти цієї статті, про які варто пам’ятати, наведені нижче.
- Абстрактний клас — це клас, який не може бути ініційований сам по собі, він повинен бути підкласом іншого класу, щоб використовувати його властивості.
- Абстрактний клас можна створити за допомогою абстрактних ключових слів.
- Ми можемо мати абстрактний клас без жодного абстрактного методу.
Поширені запитання про абстрактний клас
1. Що таке абстрактний клас у Java?
Абстрактний клас у Java — це клас, який не може бути ініційований сам по собі, але може використовуватися як підклас іншим класом.
2. Яке призначення абстрактного класу?
Основною метою абстрактного класу є створення базового класу, з якого можна отримати багато інших класів.
3. У чому головна перевага абстрактного класу?
Абстрактний клас забезпечує приховування даних у Java.
4. Чому абстрактний клас швидший за інтерфейс?
Абстрактний клас швидший за інтерфейс, оскільки інтерфейс передбачає пошук перед викликом будь-якого перевизначеного методу в Java, тоді як абстрактний клас можна використовувати безпосередньо.
Також читайте
- Різниця між абстрактним класом та інтерфейсом у Java
- Різниця між абстрактним класом і абстрактними методами
- Конструктори в абстрактному класі Java