A companion object is a special object inside a class that allows you to define functions and properties that belong to the class itself, not to instances. It acts like a static member in other languages.
Click to reveal answer
beginner
What are top-level functions in Kotlin?
Top-level functions are functions declared outside any class or object. They belong to the package and can be called directly without needing a class instance.
Click to reveal answer
intermediate
When should you use a companion object instead of a top-level function?
Use a companion object when the function logically belongs to a class and needs access to private members or to group related functions with the class. It helps organize code inside the class.
Click to reveal answer
intermediate
When is it better to use top-level functions rather than companion object functions?
Use top-level functions when the function is general, does not need access to class internals, or when you want to keep code simple and avoid unnecessary nesting inside classes.
Click to reveal answer
intermediate
How does using companion objects affect code readability compared to top-level functions?
Companion objects group related functions inside the class, making it clear they belong together, which can improve readability. Top-level functions keep code flat and simple but may scatter related functions across files.
Click to reveal answer
Which Kotlin feature allows defining functions that behave like static methods inside a class?
ACompanion object
BTop-level function
CData class
DExtension function
✗ Incorrect
Companion objects let you define functions inside a class that act like static methods.
Where are top-level functions declared in Kotlin?
AOutside any class or object
BInside a class
CInside a companion object
DInside an interface
✗ Incorrect
Top-level functions are declared outside any class or object, directly in a package.
When should you prefer top-level functions over companion object functions?
AWhen the function needs access to private class members
BWhen you want to override class methods
CWhen the function is general and not tied to a class
DWhen you want to group functions inside a class
✗ Incorrect
Top-level functions are best for general-purpose functions not tied to a class.
What is a benefit of using companion objects for functions?
AThey reduce the number of files
BThey can access private members of the class
CThey make functions global
DThey automatically create instances
✗ Incorrect
Companion object functions can access private members of their class.
Which statement about companion objects and top-level functions is true?
ATop-level functions require an instance to be called
BCompanion objects are declared outside classes
CTop-level functions can access private class members
DCompanion objects group functions inside a class
✗ Incorrect
Companion objects group functions inside a class, unlike top-level functions.
Explain the main differences between companion objects and top-level functions in Kotlin.
Think about where each function lives and what it can access.
You got /4 concepts.
Describe scenarios when you would choose a companion object over a top-level function.
Consider the relationship between the function and the class.
You got /3 concepts.
Practice
(1/5)
1. Which statement best describes when to use a companion object function in Kotlin?
easy
A. When the function logically belongs to a class and should be called with the class name.
B. When the function is a general helper unrelated to any class.
C. When you want to create an instance method that requires an object.
D. When you want to define a function inside a function.
Solution
Step 1: Understand companion object purpose
Companion object functions belong to a class and are called using the class name without needing an instance.
Step 2: Compare with other options
Top-level functions are for general helpers, instance methods require an object, and functions inside functions are local functions.
Final Answer:
When the function logically belongs to a class and should be called with the class name. -> Option A
Quick Check:
Companion functions = class-related [OK]
Hint: Use companion for class-related static-like functions [OK]
Common Mistakes:
Confusing companion functions with instance methods
Using companion for unrelated helper functions
Thinking companion functions need an object instance
2. Which of the following is the correct syntax to declare a companion function named create inside a Kotlin class MyClass?
easy
A. class MyClass { fun companion create() { } }
B. class MyClass { companion object { fun create() { } } }
C. class MyClass { companion fun create() { } }
D. companion object MyClass { fun create() { } }
Solution
Step 1: Recall companion object syntax
In Kotlin, companion functions are declared inside a companion object block within the class.
Step 2: Check each option
class MyClass { companion object { fun create() { } } } correctly declares a companion object with a function. Syntaxes like fun companion create() { } and companion fun create() { } are invalid. companion object MyClass { fun create() { } } incorrectly places companion object outside the class.
Final Answer:
class MyClass { companion object { fun create() { } } } -> Option B
Quick Check:
Companion object syntax = class MyClass { companion object { fun create() { } } } [OK]
Hint: Companion functions go inside companion object block [OK]
Common Mistakes:
Writing companion fun instead of inside companion object
Placing companion object outside the class
Using fun companion instead of companion object
3. What will be the output of the following Kotlin code?
class Example {
companion object {
fun greet() = "Hello from companion"
}
}
fun greet() = "Hello from top-level"
fun main() {
println(Example.greet())
println(greet())
}
medium
A. Compilation error due to function name conflict
B. "Hello from top-level" followed by "Hello from companion"
C. "Hello from companion" followed by "Hello from top-level"
D. Runtime error due to ambiguous call
Solution
Step 1: Identify function calls
Example.greet() calls the companion object function returning "Hello from companion". The top-level greet() returns "Hello from top-level".
Step 2: Understand call order in main()
First println prints Example.greet() output, second println prints top-level greet() output.
Final Answer:
"Hello from companion" followed by "Hello from top-level" -> Option C
Quick Check:
Companion vs top-level calls = "Hello from companion" followed by "Hello from top-level" [OK]
Hint: ClassName.func() calls companion; direct call is top-level [OK]
Common Mistakes:
Assuming name conflict causes error
Mixing up which greet() is called
Expecting runtime ambiguity error
4. Consider this Kotlin code snippet:
class Data {
companion object {
fun info() = "Data info"
}
}
fun main() {
println(info())
}
What is the error and how to fix it?
medium
A. Error: Unresolved reference 'info'. Fix: Call as Data.info()
B. Error: Companion object missing. Fix: Add companion object
C. Error: info() must be top-level. Fix: Move info() outside class
D. No error, prints "Data info"
Solution
Step 1: Identify the call to info()
The main function calls info() directly, but info() is inside Data's companion object, so it must be called with Data.info().
Step 2: Fix the call
Change println(info()) to println(Data.info()) to access the companion function correctly.
Final Answer:
Error: Unresolved reference 'info'. Fix: Call as Data.info() -> Option A
Quick Check:
Companion functions need class name prefix [OK]
Hint: Call companion functions with ClassName.function() [OK]
Common Mistakes:
Calling companion function without class name
Thinking companion functions are top-level
Trying to move companion function outside class
5. You want to create a utility function formatDate() used by multiple unrelated classes in your Kotlin project. Which approach is best and why?
hard
A. Put formatDate() inside a companion object of one class and call it via that class.
B. Define formatDate() inside a nested object inside each class.
C. Make formatDate() an instance method in each class that needs it.
D. Define formatDate() as a top-level function in a utility file for easy reuse.
Solution
Step 1: Analyze function usage
The function is a utility used by many unrelated classes, so it should be accessible without class dependency.
Step 2: Choose best location
Top-level functions are ideal for general helpers to avoid unnecessary class coupling. Companion objects tie functions to one class, which is not suitable here.
Final Answer:
Define formatDate() as a top-level function in a utility file for easy reuse. -> Option D
Quick Check:
General helpers = top-level functions [OK]
Hint: Use top-level for shared helpers, companion for class-specific [OK]
Common Mistakes:
Placing utility in companion object of unrelated class
Duplicating instance methods in multiple classes
Using nested objects unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.