📖 Scenario: You are creating a simple Kotlin class to understand how different visibility modifiers control access to class members.
🎯 Goal: Build a Kotlin class with properties and functions using public, private, internal, and protected visibility modifiers and observe how they affect access.
📋 What You'll Learn
Create a Kotlin class named Car with properties and functions using all four visibility modifiers.
Add a variable to hold the car's brand with public visibility.
Add a variable to hold the car's engine number with private visibility.
Add a function with internal visibility that returns the car's brand.
Add a protected function that returns the engine number.
Create a subclass SportsCar that tries to access the protected function.
Print outputs to show which members are accessible.
💡 Why This Matters
🌍 Real World
Visibility modifiers help protect sensitive data and control how parts of your code can be used or changed by others.
💼 Career
Understanding visibility is essential for writing safe, maintainable Kotlin code in professional Android or backend development.
Progress0 / 4 steps
1
Create the Car class with public and private properties
Create a Kotlin class called Car. Inside it, declare a public variable brand of type String and set it to "Toyota". Also declare a private variable engineNumber of type String and set it to "ENG12345".
Kotlin
Hint
Use val brand: String = "Toyota" and private val engineNumber: String = "ENG12345" inside the class.
2
Add an internal function to get the brand
Inside the Car class, add an internal function called getBrand that returns the brand variable.
Kotlin
Hint
Define internal fun getBrand(): String that returns brand.
3
Add a protected function to get the engine number
Inside the Car class, add a protected function called getEngineNumber that returns the engineNumber variable.
Kotlin
Hint
Define protected fun getEngineNumber(): String that returns engineNumber.
4
Create SportsCar subclass and print accessible members
Create a subclass called SportsCar that inherits from Car. Inside it, create a function showDetails that prints the brand and calls the protected function getEngineNumber(). Then, in the main function, create a SportsCar object and print the result of calling getBrand() and showDetails().
Kotlin
Hint
Create SportsCar subclass with showDetails() printing brand and getEngineNumber(). Then print getBrand() and call showDetails() in main().
Practice
(1/5)
1. Which visibility modifier in Kotlin allows a class member to be accessed from anywhere in the project?
easy
A. internal
B. private
C. public
D. protected
Solution
Step 1: Understand the meaning of public
The public modifier means the member is visible everywhere in the project.
Step 2: Compare with other modifiers
private restricts to class/file, internal restricts to module, protected restricts to class and subclasses only.
Final Answer:
public -> Option C
Quick Check:
Visible everywhere = public [OK]
Hint: Public means visible everywhere in the project [OK]
Common Mistakes:
Confusing private with public visibility
Thinking internal is visible everywhere
Assuming protected is public
2. Which of the following is the correct syntax to declare a private property named count in a Kotlin class?
easy
A. private val count: Int = 0
B. val private count: Int = 0
C. val count private: Int = 0
D. private count val: Int = 0
Solution
Step 1: Recall Kotlin property declaration syntax
Visibility modifier comes before val or var, so private val count: Int = 0 is correct.
Step 2: Check other options for syntax errors
Options B, C, and D have incorrect order of keywords, which is invalid in Kotlin.
Final Answer:
private val count: Int = 0 -> Option A
Quick Check:
Modifier before val/var = correct syntax [OK]
Hint: Put visibility modifier before val or var [OK]
Common Mistakes:
Placing private after val
Mixing order of keywords
Omitting colon before type
3. Consider the following Kotlin code:
open class Parent {
protected val secret = "hidden"
}
class Child : Parent() {
fun reveal() = secret
}
fun main() {
val child = Child()
println(child.reveal())
// println(child.secret) // Line X
}
What will happen if the commented Line X is uncommented?
medium
A. Compilation error: Cannot access 'secret' outside the class or subclass
B. Prints 'hidden' without error
C. Runtime error: Illegal access
D. Compilation error: 'secret' is private
Solution
Step 1: Understand protected visibility
protected members are accessible inside the class and its subclasses, but not outside.
Step 2: Analyze access in main function
Accessing child.secret from outside the class hierarchy causes a compilation error.
Final Answer:
Compilation error: Cannot access 'secret' outside the class or subclass -> Option A
Quick Check:
Protected blocks external access [OK]
Hint: Protected is accessible only inside class and subclasses [OK]
Common Mistakes:
Assuming protected is public
Expecting runtime error instead of compile error
Confusing private and protected
4. Given this Kotlin code snippet:
class Example {
private val secret = "top secret"
}
fun main() {
val ex = Example()
println(ex.secret)
}
What is the error and how to fix it?
medium
A. No error; code runs and prints 'top secret'
B. Error: Missing constructor; fix by adding constructor
C. Error: Syntax error; fix by adding semicolon
D. Error: Cannot access private property outside class; fix by changing to public
Solution
Step 1: Identify visibility of secret
The property secret is declared private, so it cannot be accessed outside the class.
Step 2: Understand the error cause and fix
Trying to print ex.secret from outside causes a compilation error. Changing private to public or providing a public method to access it fixes the error.
Final Answer:
Error: Cannot access private property outside class; fix by changing to public -> Option D
Quick Check:
Private blocks external access [OK]
Hint: Private hides members outside class; use public or accessor [OK]
Common Mistakes:
Thinking private allows outside access
Confusing syntax errors with visibility errors
Ignoring need for accessor methods
5. You have two Kotlin files in the same module: FileA.kt and FileB.kt. In FileA.kt, there is an internal function fun greet() = "Hello". Which of the following statements is true about calling greet() from FileB.kt?
hard
A. greet() cannot be called because internal means private
B. greet() can be called from FileB.kt because internal allows access within the same module
C. greet() cannot be called because internal restricts access to the same file only
D. greet() can be called only if FileB.kt inherits from FileA.kt
Solution
Step 1: Understand internal visibility
internal means visible anywhere inside the same module, regardless of file.
Step 2: Apply to given files
Since FileA.kt and FileB.kt are in the same module, greet() is accessible from FileB.kt.
Final Answer:
greet() can be called from FileB.kt because internal allows access within the same module -> Option B
Quick Check:
Internal = visible in module [OK]
Hint: Internal means visible anywhere in the same module [OK]
Common Mistakes:
Confusing internal with private or file-private
Thinking internal restricts to one file
Assuming inheritance needed for internal access
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.