Kotlin Classes Basics
Classes are the foundation of object-oriented programming in Kotlin. They serve as blueprints for creating objects, which combine data and behavior in a single unit. In this tutorial, we'll explore the basics of Kotlin classes, including how to define them, create objects, work with properties, and understand constructors.
What Are Classes?
In Kotlin, a class is a blueprint that defines the structure and behavior of objects. Think of a class as a template that describes:
- What data the object will store (properties)
- What actions the object can perform (methods)
- How the object is created (constructors)
Defining Your First Class
Let's start with a simple class definition:
class Person {
// Class body
}
This creates a basic class named Person
. Even this minimal class definition is useful - Kotlin automatically provides:
- A default constructor with no parameters
- Memory allocation for creating instances
- Basic functions like
toString()
,equals()
, andhashCode()
Creating Objects (Instances)
Once you've defined a class, you can create objects (instances) of that class:
fun main() {
val person1 = Person() // Creates a new Person instance
val person2 = Person() // Creates another Person instance
println(person1)
println(person2)
}
Output:
Person@1a407d53
Person@3d8c7aca
Notice that Kotlin doesn't use the new
keyword for object creation, unlike Java or C#.
Adding Properties to a Class
Properties represent the data each object will store:
class Person {
var name: String = "Unknown"
var age: Int = 0
}
fun main() {
val person = Person()
// Accessing properties
println("Default name: ${person.name}")
println("Default age: ${person.age}")
// Modifying properties
person.name = "Alice"
person.age = 25
println("Updated name: ${person.name}")
println("Updated age: ${person.age}")
}
Output:
Default name: Unknown
Default age: 0
Updated name: Alice
Updated age: 25
Property Types in Kotlin
In Kotlin, properties can be:
- Mutable (
var
): Can be changed after initialization - Immutable (
val
): Can only be assigned once
class User {
val id: Int = 1 // Read-only property (cannot be changed)
var username: String = "" // Mutable property (can be changed)
}
Constructors
Constructors are special methods used to initialize objects when they're created. Kotlin has two types of constructors:
Primary Constructor
The primary constructor is part of the class header:
class Person(val name: String, var age: Int) {
// Class body
}
fun main() {
val person = Person("Bob", 30)
println("Name: ${person.name}, Age: ${person.age}")
// We can change age because it's a var
person.age = 31
// We can't change name because it's a val
// person.name = "Robert" // This would cause a compilation error
println("Updated age: ${person.age}")
}
Output:
Name: Bob, Age: 30
Updated age: 31
Notice how parameters in the primary constructor can become properties by using val
or var
.
Initialization Blocks
You can add initialization code using init
blocks:
class Person(val name: String, var age: Int) {
init {
println("Person created with name: $name")
// Validate age
require(age >= 0) { "Age cannot be negative" }
}
}
fun main() {
val person = Person("Charlie", 25)
// This would throw an exception: val invalid = Person("Invalid", -1)
}
Output:
Person created with name: Charlie
Secondary Constructors
You can define additional constructors if needed:
class Person(val name: String, var age: Int) {
var email: String = ""
// Secondary constructor
constructor(name: String, age: Int, email: String) : this(name, age) {
this.email = email
}
}
fun main() {
val person1 = Person("Dave", 40)
val person2 = Person("Emma", 35, "[email protected]")
println("Person 1: ${person1.name}, ${person1.age}, ${person1.email}")
println("Person 2: ${person2.name}, ${person2.age}, ${person2.email}")
}
Output:
Person 1: Dave, 40,
Person 2: Emma, 35, [email protected]
Member Functions
Classes can contain functions (methods) that represent the behaviors of objects:
class Person(val name: String, var age: Int) {
fun introduce() {
println("Hi, I'm $name and I'm $age years old")
}
fun celebrateBirthday() {
age++
println("$name just turned $age")
}
}
fun main() {
val person = Person("Frank", 45)
person.introduce()
person.celebrateBirthday()
}
Output:
Hi, I'm Frank and I'm 45 years old
Frank just turned 46
Real-World Example: Creating a Book Class
Let's create a practical example of a Book
class that might be used in a digital library system:
class Book(
val title: String,
val author: String,
val year: Int,
val isbn: String,
var available: Boolean = true
) {
// Track number of times this book was borrowed
private var borrowCount: Int = 0
fun borrow(): Boolean {
if (available) {
available = false
borrowCount++
println("\"$title\" has been borrowed")
return true
}
println("Sorry, \"$title\" is not available")
return false
}
fun returnBook() {
if (!available) {
available = true
println("\"$title\" has been returned")
} else {
println("This book wasn't borrowed")
}
}
fun displayInfo() {
println("Book: \"$title\"")
println("Author: $author")
println("Year: $year")
println("ISBN: $isbn")
println("Available: ${if(available) "Yes" else "No"}")
println("Times borrowed: $borrowCount")
}
}
fun main() {
// Create a few books
val book1 = Book("The Great Gatsby", "F. Scott Fitzgerald", 1925, "978-3-16-148410-0")
val book2 = Book("Moby Dick", "Herman Melville", 1851, "978-1-23-456789-7")
// Display initial info
book1.displayInfo()
println()
// Borrow and return books
book1.borrow()
book2.borrow()
println()
book1.displayInfo()
println()
book1.returnBook()
book1.borrow()
book1.returnBook()
println()
// Display final state
book1.displayInfo()
}
Output:
Book: "The Great Gatsby"
Author: F. Scott Fitzgerald
Year: 1925
ISBN: 978-3-16-148410-0
Available: Yes
Times borrowed: 0
"The Great Gatsby" has been borrowed
"Moby Dick" has been borrowed
Book: "The Great Gatsby"
Author: F. Scott Fitzgerald
Year: 1925
ISBN: 978-3-16-148410-0
Available: No
Times borrowed: 1
"The Great Gatsby" has been returned
"The Great Gatsby" has been borrowed
"The Great Gatsby" has been returned
Book: "The Great Gatsby"
Author: F. Scott Fitzgerald
Year: 1925
ISBN: 978-3-16-148410-0
Available: Yes
Times borrowed: 2
Summary
In this tutorial, you've learned the basics of Kotlin classes:
- How to define classes and create objects
- Working with properties (both mutable and immutable)
- Using primary and secondary constructors
- Adding initialization blocks
- Creating member functions
- A practical example of using classes in a real-world application
Classes are a fundamental building block in Kotlin and object-oriented programming. As you continue your journey, you'll learn more advanced concepts like inheritance, interfaces, and abstract classes that build upon these basics.
Exercises
-
Create a
Rectangle
class with properties for width and height. Add methods to calculate area and perimeter. -
Design a
BankAccount
class with properties for account number, owner name, and balance. Add methods for deposit and withdrawal with appropriate validations. -
Implement a
Student
class with properties for name, ID, and a list of grades. Include methods to add grades and calculate the average grade.
Additional Resources
Happy coding with Kotlin classes!
💡 Found a typo or mistake? Click "Edit this page" to suggest a correction. Your feedback is greatly appreciated!