logo

Clase abstracta en Java

En Java, la clase abstracta se declara con la palabra clave abstracta. Puede tener métodos tanto abstractos como no abstractos (métodos con cuerpos). Un resumen es un modificador de Java aplicable a clases y métodos en Java, pero no para variables . En este artículo, aprenderemos el uso de clases abstractas en Java.

¿Qué es la clase abstracta en Java?

La clase abstracta de Java es una clase que no puede iniciarse por sí misma, necesita ser subclasificada por otra clase para usar sus propiedades. Una clase abstracta se declara utilizando la palabra clave abstracta en su definición de clase.

Ilustración de la clase abstracta

abstract class Shape  {  int color;  // An abstract function  abstract void draw(); }>

En Java, los siguientes algunos observaciones importantes sobre las clases abstractas son las siguientes:



  1. No se puede crear una instancia de una clase abstracta.
  2. Se permiten constructores.
  3. Podemos tener una clase abstracta sin ningún método abstracto.
  4. Puede haber un método final en una clase abstracta, pero cualquier método abstracto en la clase (clase abstracta) no se puede declarar como final o, en términos más simples, el método final no puede ser abstracto en sí mismo, ya que generará un error: Combinación ilegal de modificadores: abstracto y final
  5. Podemos definir métodos estáticos en una clase abstracta.
  6. Podemos usar el palabra clave abstracta por declarar clases de nivel superior (clase externa), así como clases internas como abstracto
  7. si un clase contiene al menos un método abstracto entonces es obligatorio declarar una clase como abstracta
  8. Si el clase infantil no puede proporcionar implementación a todos los métodos abstractos del clase de padres entonces deberíamos declarar que Clase infantil como resumen. para que la clase Child del siguiente nivel proporcione implementación al método abstracto restante

Ejemplos de clases abstractas de Java

1. Ejemplo de clase abstracta que tiene método abstracto

A continuación se muestra la implementación del tema anterior:

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

>

>

Producción

avinash 21 222.2>

2. Clase abstracta que tiene constructor, miembro de datos y métodos.

Elementos que la clase abstracta puede tener.

  • miembro de datos
  • método abstracto
  • cuerpo del método (método no abstracto)
  • constructor
  • método principal().

A continuación se muestra la implementación del tema anterior:

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

>

>

Producción

Learning Subject C , Java , C++ Preparing Right Now!>

Propiedades de la clase abstracta

Profundicemos en estas observaciones y justifíquelas con la ayuda de programas Java limpios de la siguiente manera.

Observación 1

En Java, al igual que en C++, no se puede crear una instancia de una clase abstracta, aunque podemos tener referencias al tipo de clase abstracta. Es como se muestra a continuación a través del programa Java limpio.

Ejemplo

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

>

>

Producción

cadena como matriz
Derived fun() called>

Observación 2

Como C++, un clase abstracta puede contener constructores en Java. Y se llama a un constructor de una clase abstracta cuando se crea una instancia de una clase heredada. Es como se muestra en el siguiente programa de la siguiente manera:

Ejemplo:

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

>

>

Producción

Base Constructor Called Derived Constructor Called Derived fun() called>

Observación 3

En Java podemos tener una clase abstracta sin ningún método abstracto . Esto nos permite crear clases de las que no se pueden crear instancias, sino que solo se pueden heredar . Es como se muestra a continuación con la ayuda de un programa Java limpio.

Ejemplo:

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

>

>

Producción

Function of Base class is called>

Observación 4

Las clases abstractas también pueden tener final métodos (métodos que no se pueden anular)

Ejemplo:

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

>

>

Producción

Base fun() called>

Observación 5

Para cualquier clase abstracta de Java no podemos crear un objeto, es decir, para una clase abstracta no es posible crear instancias.

Java




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

>

>

Producción:

clase abstracta

Observación 6

Similar a la interfaz Podemos definir métodos estáticos en una clase abstracta. eso se puede llamar de forma independiente sin un objeto.

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

>

>

Producción

Geeks for Geeks>

Observación 7

Podemos usar el palabra clave abstracta para declarar clases de nivel superior (clase externa), así como clases internas como abstractas

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

>

>

Producción

Inside abstract method implementation>

Observación 8

si un la clase contiene al menos un método abstracto entonces Es obligatorio que declaremos la clase como abstracta. de lo contrario, obtendremos un error en tiempo de compilación. Si una clase contiene al menos un método abstracto, la implementación no está completa para esa clase y, por lo tanto, no se recomienda crear un objeto para restringir la creación de objetos para dichas clases parciales. usamos palabra clave abstracta.

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

>

>

Producción

Hello>

Observación 9

Si el Niño Si una clase no puede proporcionar implementación a todos los métodos abstractos de la clase principal, entonces debemos declarar esa clase secundaria como abstracta para que la clase secundaria del siguiente nivel proporcione implementación al método abstracto restante.

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

>

>

Producción

Inside m1 Inside m2 Inside m3>

En C++, si una clase tiene al menos una función virtual pura , entonces la clase se vuelve abstracta. A diferencia de C++, en Java, se utiliza una palabra clave abstracta separada para hacer que una clase sea abstracta.

Conclusión

Los puntos para recordar de este artículo se mencionan a continuación:

  • Una clase abstracta es una clase que no puede ser iniciada por sí misma, necesita ser subclasificada por otra clase para usar sus propiedades.
  • Se puede crear una clase abstracta utilizando palabras clave abstractas.
  • Podemos tener una clase abstracta sin ningún método abstracto.

Preguntas frecuentes sobre la clase abstracta

1. ¿Qué es una clase abstracta en Java?

Una clase abstracta en Java es una clase que no se puede iniciar por sí sola, pero que otra clase puede utilizar como subclase.

2. ¿Cuál es el propósito de la clase abstracta?

El objetivo principal de una clase abstracta es crear una clase base de la que se puedan derivar muchas otras clases.

3. ¿Cuál es la principal ventaja de la clase abstracta?

Una clase abstracta proporciona la posibilidad de ocultar datos en Java.

4. ¿Por qué la clase abstracta es más rápida que la interfaz?

Una clase abstracta es más rápida que una interfaz porque la interfaz implica una búsqueda antes de llamar a cualquier método anulado en Java, mientras que la clase abstracta se puede usar directamente.

Además, lea