<p>In this article, you will learn about Kotlin abstract classes, abstract methods and how to use them in our program with the help of examples.</p>
<h3><span style="color: #000080;"><strong>Abstract Classes</strong></span></h3>
<p>An <span style="color: #008000;"><strong>abstract class</strong></span> is a class that cannot be instantiated (we cannot create objects of an abstract class).</p>
<h5 class="p1"><span style="color: #0000ff;"><strong>Syntax</strong></span></h5>
<p>We use the <span style="color: #008000;"><strong>abstract</strong></span> keyword to declare an abstract class.</p>
<pre><strong><span style="color: #0000ff;">abstract</span></strong> class className {
<span style="color: #008000;"><strong>//properties and functions</strong></span>
}</pre>
<p>If we try to create objects of an abstract class, we will get a compilation error. For example,</p>
<pre><strong><span style="color: #008000;">//abstract class</span></strong>
abstract class Person {

 <strong><span style="color: #008000;">//class members</span></strong>
 var name: String = "Arun Kumar"

 fun show() {
 println("Name: $name ")
 }
}

fun main(args: Array<;String>;) {
 <strong><span style="color: #008000;">//creating Person instance</span></strong>
<strong><span style="color: #008000;"> //error: cannot create an instance of an abstract class</span></strong>
 val person = Person()

}</pre>
<p>We can access the members of a class by creating its object or by creating an object of its subclass.</p>
<p class="p1">Abstract classes cannot be instantiated but we can create subclasses from it. We can create objects of subclasses to access members of the abstract class.</p>
<p class="p2">Abstract class<span class="Apple-converted-space"> </span>is used to define common characteristics of subclasses and the only purpose of the abstract class is to let other sub classes inherit from it.</p>
<p class="p1">Before we learn about it in detail, we need to understand <span style="color: #0000ff;"><strong>abstract members</strong></span>.</p>
<h3><span style="color: #000080;"><strong>Abstract Members</strong></span></h3>
<p>Abstract classes can contain properties that are not initialized called <strong><span style="color: #008000;">abstract properties</span></strong> and methods that contains no implementation (without any body) called <strong><span style="color: #008000;">abstract methods</span></strong>.</p>
<p>We use the same keyword <span style="color: #0000ff;"><strong>abstract</strong></span> to create abstract member (abstract property or abstract function).</p>
<pre><strong><span style="color: #008000;">//abstract class</span></strong>
abstract class Vehicle {

 <strong><span style="color: #008000;"> //abstract variable</span></strong>
 abstract var fuel: String <span style="color: #0000ff;"><strong>//not initialized</strong></span>

 <span style="color: #008000;"><strong>//abstract function</strong></span>
 abstract fun start() <strong><span style="color: #0000ff;">//no implementation</span></strong>

}</pre>
<p class="p1">An abstract class can contain both abstract and non-abstract members as shown below:</p>
<pre><span style="color: #0000ff;"><strong>abstract</strong></span> class Vehicle(val fuelType: String) { <strong><span style="color: #008000;">// non-abstract Property</span></strong>

 <strong><span style="color: #0000ff;">abstract</span></strong> var fuelCapacity: Int <strong><span style="color: #008000;">// abstract Property</span></strong>

 <strong><span style="color: #0000ff;">abstract</span></strong> fun start() <strong><span style="color: #008000;">// abstract function</span></strong>

 <strong><span style="color: #0000ff;">abstract</span></strong> fun stop() <strong><span style="color: #008000;"> // abstract function</span></strong>

 fun park() { <strong><span style="color: #008000;">// non-abstract function</span></strong>
 println("Vehicle is in park mode")
 }
}</pre>
<p><span style="color: #000080;"><strong>Note:</strong> </span>Abstract classes and abstract members are always open. You do not need to explicitly use <span style="color: #0000ff;"><strong>open</strong></span> keyword.</p>
<h3><span style="color: #000080;"><strong>Overriding abstract members</strong></span></h3>
<p>An abstract class cannot be instantiated; therefore we must inherit it so that we can access the members of an abstract class.</p>
<p class="p1">When an abstract class is inherited,</p>
<ul>
<li class="p1">To create an object of subclass, we must have to override (provide implementation to a method already defined in superclass) all the <span style="color: #008000;"><strong>abstract members </strong></span>of super class in our subclass.</li>
<li class="p1">However, if subclass does not implement abstract members, then the subclass must also be declared <strong>abstract </strong>(now subclass cannot be instantiated).</li>
</ul>
<h5><strong><span style="color: #0000ff;">Example </span></strong></h5>
<pre><strong><span style="color: #008000;">//abstract class</span> </strong>
<strong>abstract</strong> class Person(val name: String, val rollNo: Int) { <strong><span style="color: #008000;">// non-abstract property</span></strong>
 
 <strong><span style="color: #008000;">// abstract property (Must be overridden by Subclasses)</span></strong>
 <strong>abstract</strong> var caste: String

 <strong><span style="color: #008000;">// abstract function (Must be implemented by Subclasses)</span></strong>
 <strong>abstract</strong> fun dateOfBirth(date: String)

 <strong><span style="color: #008000;">// non-abstract method</span></strong>
 fun show() {
 println("Student Name: $name")
 println("Roll No: $rollNo")
 println("Caste: $caste")
 }
}

<span style="color: #008000;"><strong>//derived class inheriting Person class</strong></span>
class Student(name: String, rollNo: Int) : Person(name, rollNo) {

<span style="color: #008000;"><strong> //abstract property caste is initialized</strong></span>
 <strong>override</strong> var caste = "OBC"

<span style="color: #008000;"><strong> //implementation of abstract function</strong> <strong>dateOfBirth</strong></span>
 <strong>override</strong> fun dateOfBirth(date: String) {
 println("Date of Birth is: $date")
 }
}

fun main(args: Array<;String>;) {
 val student = Student("Arun Kumar", 100)
 student.show()
 student.dateOfBirth("02 July 1995")
}</pre>
<h5><strong><span style="color: #0000ff;">Output</span></strong></h5>
<pre>Student Name: Arun Kumar
Roll No: 100
Caste: OBC
Date of Birth is: 02 July 1995</pre>
<h5><strong><span style="color: #0000ff;">Example explained</span></strong></h5>
<ul>
<li>Person is an abstract class which contains abstract members ( <strong><span style="color: #008000;">caste</span></strong> <strong>(property)</strong> and <strong><span style="color: #008000;">dateOfBirth </span>(function)</strong>) and non-abstract members ( <strong><span style="color: #008000;">name, rollNo</span></strong> <strong>(properties)</strong> and <strong><span style="color: #008000;">show </span>(function)</strong>).</li>
<li class="p1"><span style="color: #008000;"><strong>Student</strong></span> class is inherited from the super class <span style="color: #008000;"><strong>Person</strong></span>. The subclass <strong>(Student)</strong><strong> </strong>overriding the abstract members of the <strong>Person class</strong>.</li>
<li class="p1">Now creating an instance of subclass we cannot only access its members, but we can also access its superclass<strong>(Person)</strong> members (abstract and non-abstract).</li>
</ul>
<h3><strong><span style="color: #000080;">Overriding a non-abstract open member with an abstract one</span></strong></h3>
<p class="p1">In Kotlin, we can override the non-abstract open members of the open class with the <span style="color: #008000;"><strong>abstract</strong></span> keyword in the abstract class.</p>
<!-- WP QUADS Content Ad Plugin v. 2.0.98.1 -->
<div class="quads-location quads-ad2" id="quads-ad2" style="float:none;margin:0px;">

</div>

<h5><span style="color: #0000ff;"><strong>Example</strong></span></h5>
<pre><strong><span style="color: #008000;">//open class</span></strong>
open class Vehicle {

<strong><span style="color: #008000;"> //open non-abstract members</span></strong>
 open fun start() {
 println("Vehicle is in start mode.")
 }

 open fun stop() {
 println("Vehicle is in stop mode.")
 }
}
<strong><span style="color: #008000;">//abstract class</span></strong>
abstract class FourWheeler : Vehicle() {
 <strong><span style="color: #008000;">//abstract functions</span></strong>
 abstract override fun start()

 abstract override fun stop()
}

<strong><span style="color: #008000;">//Car class inheriting abstract class FourWheeler</span></strong>
class Car : FourWheeler() {

<span style="color: #008000;"><strong> //implementation of abstract function</strong> <strong>start</strong></span>
 override fun start() {
 println("Car is in drive mode.")
 }

<span style="color: #008000;"><strong> //implementation of abstract function</strong> <strong>stop</strong></span>
 override fun stop() {
 println("Car is in stop mode.")
 }
}

fun main(args: Array<;String>;) {
 val vehicle = Vehicle()
 vehicle.start()
 val car = Car()
 car.start()
}</pre>
<h5><span style="color: #0000ff;"><strong>Output</strong></span></h5>
<pre>Vehicle is in start mode.
Car is in drive mode.</pre>
<h3></h3>
<h3><strong><span style="color: #000080;">Creating abstract class reference variable</span></strong></h3>
<p>We cannot create instance of abstract class but we can create reference variable of abstract class.</p>
<h5><span style="color: #0000ff;"><strong>Example</strong></span></h5>
<pre><strong><span style="color: #008000;">//abstract class</span></strong> 
abstract class Vehicle {

<strong><span style="color: #008000;"> //abstract functions</span></strong> 
 abstract fun start()

 abstract fun stop()
}

<span style="color: #008000;"><strong>//Car class inheriting abstract class Vehicle</strong></span>
class Car : Vehicle() {

<span style="color: #008000;"><strong> //implementation of abstract function</strong> <strong>start</strong></span>
 override fun start() {
 println("Car is in drive mode.")
 }

<span style="color: #008000;"><strong> //implementation of abstract function</strong> <strong>stop</strong></span>
 override fun stop() {
 println("Car is in stop mode.")
 }

 <strong><span style="color: #008000;">//subclass method</span></strong>
 fun park() {
 println("Car is in park mode.")
 }
}


fun main(args: Array<;String>;) {

 <strong><span style="color: #008000;">//error:'Vehicle' is abstract; cannot be instantiated</span></strong>
 <strong>//Vehicle vehicle = new Vehicle();</strong>

 <strong><span style="color: #008000;">// We can have references of abstract class type.</span></strong>
 val car: Vehicle = Car()
 car.start()
 car.stop()
 <strong><span style="color: #008000;">//error: using base class reference variable we can only access its own members.</span></strong>
<strong><span style="color: #008000;"><span style="color: #000000;"> //car.park()</span> //park is not a function of Vehicle abstract class.</span></strong>

}</pre>
<h5><span style="color: #0000ff;"><strong>Output</strong></span></h5>
<pre>Car is in drive mode.
Car is in stop mode.</pre>
<p><span style="color: #000080;"><strong>Note:</strong> <strong>Using abstract class reference variable we cannot access subclass members.</strong></span></p>
<h3><span style="color: #000080;"><strong>Abstract class Constructor</strong></span></h3>
<p class="p1">An abstract class can contain constructors and it is called when an instance of inherited class is created.</p>
<h5><span style="color: #0000ff;"><strong>Example</strong></span></h5>
<pre><strong><span style="color: #008000;">//abstract class primary constructor with initializer block</span></strong>
abstract class Employee(name: String, age: Int) {

 init {
 println("My name is $name, $age years old ")
 }
}

<strong><span style="color: #008000;">//subclass inheriting abstract class Employee</span></strong>
<strong><span style="color: #008000;">//subclass primary constructor with initializer block</span></strong>
class Manager(name: String, age: Int, salary: Int) : Employee(name, age) {

 init {
 println("I am Manager and earning $salary per month.")
 println()
 }

}

fun main(args: Array<;String>;) {
<strong><span style="color: #008000;">//creating subclass instance</span></strong>
 Manager("Arun", 40, 90000)
}</pre>
<h5><span style="color: #0000ff;"><strong>Output</strong></span></h5>
<pre>My name is Arun, 40 years old 
I am Manager and earning 90000 per month.</pre>
<h5><span style="color: #0000ff;"><strong>Example</strong></span></h5>
<pre><span style="color: #008000;"><strong>//abstract class</strong></span>
abstract class Employee {

 <strong><span style="color: #008000;">//abstract class secondary constructor</span></strong>
 constructor(name: String, age: Int) {
 println("My name is $name, $age years old ")
 }
}

<strong><span style="color: #008000;">//subclass inheriting abstract class</span></strong>
class Manager : Employee {
 <strong><span style="color: #008000;">//secondary constructor calling abstract class secondary constructor</span></strong>
 constructor(name: String, age: Int, salary: Int) : super(name, age) {
 println("I am Manager and earning $salary per month.")
 println()
 }

}

fun main(args: Array<;String>;) {
<strong><span style="color: #008000;">//creating subclass instance</span></strong>
 Manager("Arun", 40, 90000)
}</pre>
<h5><span style="color: #0000ff;"><strong>Output</strong></span></h5>
<pre>My name is Arun, 40 years old 
I am Manager and earning 90000 per month.</pre>
<p>Visit <span style="color: #0000ff;"><strong><a style="color: #0000ff;" href="https://c1ctech.com/kotlin-constructor-in-inheritance/">Kotlin Constructor in Inheritance</a></strong></span> to learn more about Constructor behavior in Inheritance.</p>
<h4 class="p1"><span style="color: #000080;"><b>Points to Remember:</b></span></h4>
<ul class="ul1">
<li>To create abstract classes and abstract members we use the <span style="color: #008000;"><strong>abstract</strong></span> keyword.</li>
<li>Abstract methods have no implementation (method body) and abstract properties are not initialized.</li>
<li>A class containing abstract member (abstract property or abstract function ) must be declared as <strong><span style="color: #008000;">abstract</span>.</strong></li>
<li>An abstract class can contain abstract and non-abstract methods.</li>
<li>Abstract classes cannot be instantiated but we can create reference variable of abstract class.</li>
<li>Abstract class can have <strong><span class="s2"><a href="https://c1ctech.com/kotlin-constructor/"><span style="color: #008000;">constructors</span>.</a></span></strong></li>
<li class="li2">The class inheriting the abstract class must either be declared <span style="color: #008000;"><strong>abstract</strong></span> or implement abstract members.</li>
<li>To create an object of a class that extends abstract class we must have to implement its abstract members in our class.</li>
<li>If the class inheriting the abstract class is declared <span style="color: #008000;"><strong>abstract</strong></span>, it’s not mandatory to override abstract methods but now we cannot create an instance of subclass.</li>
</ul>
<p> ;</p>


