Article image Object-Oriented Programming in Kotlin

7. Object-Oriented Programming in Kotlin

Page 7 | Listen in audio

Object-Oriented Programming (OOP) is a programming paradigm that uses "objects" to design software. These objects can contain data, in the form of fields, and code, in the form of procedures. Kotlin, being a modern programming language, embraces OOP principles and integrates them seamlessly with functional programming features, offering a robust and flexible environment for Android app development.

At the core of OOP in Kotlin are classes and objects. A class is a blueprint for creating objects (a particular data structure), whereas an object is an instance of a class. In Kotlin, classes are declared using the class keyword, followed by the class name. Here's a simple example:

class Car {
    var color: String = ""
    var model: String = ""
    
    fun drive() {
        println("The car is driving")
    }
}

In the above example, Car is a class with two properties, color and model, and a method drive. To create an object of this class, you would do the following:

val myCar = Car()
myCar.color = "Red"
myCar.model = "Toyota"
myCar.drive()

In Kotlin, constructors are used to initialize the properties of a class. The primary constructor is part of the class header and can be used to initialize properties directly. Here's how you can use a primary constructor:

class Car(val color: String, val model: String) {
    fun drive() {
        println("The $color $model is driving")
    }
}

With this setup, you can create a Car object and initialize its properties in one go:

val myCar = Car("Red", "Toyota")
myCar.drive()

Kotlin also supports secondary constructors, which are used when you need more than one way to initialize your objects. Here's an example:

class Car {
    var color: String
    var model: String

    constructor(color: String, model: String) {
        this.color = color
        this.model = model
    }

    constructor(model: String) {
        this.color = "Unknown"
        this.model = model
    }

    fun drive() {
        println("The $color $model is driving")
    }
}

Inheritance is another cornerstone of OOP, allowing a class to inherit properties and methods from another class. In Kotlin, you use the : symbol to denote inheritance. The open keyword is used to declare a class that can be inherited:

open class Vehicle {
    open fun start() {
        println("Vehicle is starting")
    }
}

class Car : Vehicle() {
    override fun start() {
        println("Car is starting")
    }
}

In this example, Car inherits from Vehicle and overrides the start method. This allows you to define specialized behavior in subclasses while maintaining a common interface.

Encapsulation is the principle of hiding the internal state of an object and requiring all interaction to be performed through an object's methods. In Kotlin, you can control access to properties and methods using visibility modifiers such as private, protected, internal, and public. Here's an example:

class BankAccount(private var balance: Double) {
    fun deposit(amount: Double) {
        if (amount > 0) {
            balance += amount
        }
    }

    fun getBalance(): Double {
        return balance
    }
}

The balance property is private, meaning it can only be accessed within the BankAccount class. The deposit method provides controlled access to modify the balance, ensuring the integrity of the data.

Polymorphism is another key concept in OOP, allowing objects to be treated as instances of their parent class. This is achieved through method overriding. In Kotlin, polymorphism is used to define a common interface for different data types. Here's an example:

open class Animal {
    open fun sound() {
        println("Animal sound")
    }
}

class Dog : Animal() {
    override fun sound() {
        println("Bark")
    }
}

class Cat : Animal() {
    override fun sound() {
        println("Meow")
    }
}

fun main() {
    val myDog: Animal = Dog()
    val myCat: Animal = Cat()

    myDog.sound() // Outputs: Bark
    myCat.sound() // Outputs: Meow
}

In this example, both Dog and Cat are subclasses of Animal, and they override the sound method. When you call sound on an Animal reference, the appropriate subclass method is invoked, demonstrating polymorphism.

Abstraction is the concept of hiding complex implementation details and showing only the essential features of an object. In Kotlin, you can achieve abstraction using abstract classes and interfaces. An abstract class is a class that cannot be instantiated and may contain abstract methods that must be implemented by subclasses:

abstract class Shape {
    abstract fun area(): Double
}

class Circle(private val radius: Double) : Shape() {
    override fun area(): Double {
        return Math.PI * radius * radius
    }
}

class Rectangle(private val width: Double, private val height: Double) : Shape() {
    override fun area(): Double {
        return width * height
    }
}

In this example, Shape is an abstract class with an abstract method area. Both Circle and Rectangle are concrete classes that provide specific implementations of the area method.

Interfaces in Kotlin are similar to abstract classes but can contain both abstract methods and method implementations. A class can implement multiple interfaces, allowing for more flexible design:

interface Drivable {
    fun drive()
}

interface Flyable {
    fun fly()
}

class FlyingCar : Drivable, Flyable {
    override fun drive() {
        println("Driving on the road")
    }

    override fun fly() {
        println("Flying in the sky")
    }
}

In this example, FlyingCar implements both Drivable and Flyable interfaces, providing concrete implementations for their methods. This demonstrates how interfaces can be used to define capabilities that classes can choose to implement.

Kotlin's OOP features are designed to be concise and expressive, allowing developers to write clean and maintainable code. By leveraging classes, inheritance, encapsulation, polymorphism, and abstraction, you can build complex Android applications that are both scalable and easy to understand.

In summary, Object-Oriented Programming in Kotlin provides a powerful toolkit for Android app development. By understanding and applying OOP principles, you can create applications that are modular, reusable, and adaptable to changing requirements. Whether you're building a simple app or a complex system, Kotlin's OOP capabilities will help you manage complexity and deliver high-quality software.

Now answer the exercise about the content:

What is the correct way to declare a class in Kotlin?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Classes and Objects

Next page of the Free Ebook:

8Classes and Objects

6 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text