Abstract class in Java

Abstract class in java is similar to interface except that it can contain default method implementation. An abstract class can have abstract method without body and it can have methods with implementation also.

abstract keyword is used to create a abstract class and method. Abstract class in java can’t be instantiated. Abstract class is mostly used to provide base for subclasses to extend and implement the abstract methods and override or use the implemented methods in abstract class.

package com.journaldev.design; //abstract class public abstract class Person { private String name; private String gender; public Person(String nm, String gen){ this.name=nm; this.gender=gen; } //abstract method public abstract void work(); @Override public String toString(){ return "Name="+this.name+"::Gender="+this.gender; } public void changeName(String newName) { this.name = newName; } }

Notice that work() is an abstract method and it has no body. Here is a concrete class example extending abstract class in java.

package com.journaldev.design; public class Employee extends Person { private int empId; public Employee(String nm, String gen, int id) { super(nm, gen); this.empId=id; } @Override public void work() { if(empId == 0){ System.out.println("Not working"); }else{ System.out.println("Working as employee!!"); } } public static void main(String args[]){ //coding in terms of abstract classes Person student = new Employee("Dove","Female",0); Person employee = new Employee("Pankaj","Male",123); student.work(); employee.work(); //using method implemented in abstract class - inheritance employee.changeName("Pankaj Kumar"); System.out.println(employee.toString()); } }

Ways to achieve Abstraction

There are two ways to achieve abstraction in java

  1. Abstract class (0 to 100%)
  2. Interface (100%)
Points to Remember
  • An abstract class must be declared with an abstract keyword.

  • It can have abstract and non-abstract methods.

  • It cannot be instantiated.

  • It can have constructors and static methods also.

  • It can have final methods which will force the subclass not to change the body of the method.

Example of abstract class
abstract class A{}

Abstract Method in Java

A method which is declared as abstract and does not have implementation is known as an abstract method.

Example of abstract method
abstract void printStatus();//no method body and abstract

Example of Abstract class that has an abstract method

In this example, Bike is an abstract class that contains only one abstract method run. Its implementation is provided by the Honda class.

abstract class Bike{ abstract void run(); } class Honda4 extends Bike{ void run(){System.out.println("running safely");} public static void main(String args[]){ Bike obj = new Honda4(); obj.run(); } }

running safely
Understanding the real scenario of Abstract class

In this example, Shape is the abstract class, and its implementation is provided by the Rectangle and Circle classes.

Mostly, we don't know about the implementation class (which is hidden to the end user), and an object of the implementation class is provided by the factory method.

A factory method is a method that returns the instance of the class. We will learn about the factory method later.

In this example, if you create the instance of Rectangle class, draw() method of Rectangle class will be invoked.

abstract class Shape{ abstract void draw(); } //In real scenario, implementation is provided by others i.e. unknown by end user class Rectangle extends Shape{ void draw(){System.out.println("drawing rectangle");} } class Circle1 extends Shape{ void draw(){System.out.println("drawing circle");} } //In real scenario, method is called by programmer or user class TestAbstraction1{ public static void main(String args[]){ Shape s=new Circle1();//In a real scenario, object is provided through method, e.g., getShape() method s.draw(); } }

drawing circle
Another example of Abstract class in java
abstract class Bank{ abstract int getRateOfInterest(); } class SBI extends Bank{ int getRateOfInterest(){return 9;} } class PNB extends Bank{ int getRateOfInterest(){return 10;} } class TestBank{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %"); b=new PNB(); System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %"); }}

Rate of Interest is: 9 % Rate of Interest is: 10 %
Abstract class having constructor, data member and methods

An abstract class can have a data member, abstract method, method body (non-abstract method), constructor, and even main() method.

//Example of an abstract class that has abstract and non-abstract methods abstract class Bike{ Bike(){System.out.println("bike is created");} abstract void run(); void changeGear(){System.out.println("gear changed");} } //Creating a Child class which inherits Abstract class class Honda extends Bike{ void run(){System.out.println("running safely..");} } //Creating a Test class which calls abstract and non-abstract methods class TestAbstraction2{ public static void main(String args[]){ Bike obj = new Honda(); obj.run(); obj.changeGear(); } }

bike is created running safely.. gear changed
Rule: If there is an abstract method in a class, that class must be abstract.
class Bike12{ abstract void run(); }

compile time error
Rule: If you are extending an abstract class that has an abstract method, you must either provide the implementation of the method or make this class abstract.
Another real scenario of abstract class

The abstract class can also be used to provide some implementation of the interface. In such case, the end user may not be forced to override all the methods of the interface.

Note: If you are beginner to java, learn interface first and skip this example.
interface A{ void a(); void b(); void c(); void d(); } abstract class B implements A{ public void c(){System.out.println("I am c");} } class M extends B{ public void a(){System.out.println("I am a");} public void b(){System.out.println("I am b");} public void d(){System.out.println("I am d");} } class Test5{ public static void main(String args[]){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }}

I am a I am b I am c I am d
Abstract class in Java Important Points
  1. abstract keyword is used to create an abstract class in java.

  2. Abstract class in java can’t be instantiated.

  3. We can use abstract keyword to create an abstract method, an abstract method doesn’t have body.

  4. If a class have abstract methods, then the class should also be abstract using abstract keyword, else it will not compile.

  5. It’s not necessary to have abstract class to have abstract method.

  6. If abstract class doesn’t have any method implementation, its better to use interface because java doesn’t support multiple class inheritance.

  7. The subclass of abstract class in java must implement all the abstract methods unless the subclass is also an abstract class.

  8. All the methods in an interface are implicitly abstract unless the interface methods are static or default. Static methods and default methods in interfaces are added in Java 8, for more details read Java 8 interface changes.

  9. Java Abstract class can implement interfaces without even providing the implementation of interface methods.

  10. Java Abstract class is used to provide common method implementation to all the subclasses or to provide default implementation.

  11. We can run abstract class in java like any other class if it has main() method.