Сопутствующий объект такой же, как «статический» в Java.На самом деле в нем нет ни одного экземпляра вашего класса.Поэтому, если ваш printname()
метод только что сказал println("Hello again!")
, вы могли бы сделать следующее:
println(Normal().name) // creates a new Normal class and prints "hallo"
Normal.printname() // Does not create a new normal class but just prints "Hello again!"
Обратите внимание, что на самом деле мы не создали новый Normal во второй строке (без скобок конструктора).Метод printname () можно рассматривать как принадлежащий к определению класса, а не примеру или экземпляру этого класса.
Это скорее похоже наинструкция для авто;он может ссылаться и говорить о внутренностях автомобиля, но вам нужно иметь настоящую машину, чтобы делать что-нибудь забавное с руководством.
Мы можем получить доступ к внутренним частям экземпляра класса, если у нас есть такой,Таким образом, передача экземпляра класса будет работать:
class Normal() {
private var name: String = "hallo"
companion object {
fun printName(normal : Normal) {
println(normal.name) // Note that I made the "name" var private
}
}}
Объект-компаньон также может получить доступ ко всему, что находится внутри самого объекта-компаньона, поэтому это также будет работать:
class Normal() {
companion object {
private var name: String = "hallo"
fun printName() {
println(name) // Note I moved the "name" var into the companion object
}
}}
ИВы можете комбинировать их:
class Normal() {
private var name: String = "Vilpe89"
companion object {
private var greeting: String = "Hello "
fun printName(normal : Normal) {
println("$greeting ${normal.name}!")
}
}}
Теперь вы можете вызвать вышеуказанный код следующим образом:
Normal.printname(Normal()) // uses Normal's companion object
// method on an instance of Normal,
// and prints "Hello Vilpe89!"
Это очень отличается от того, что произошло бы, если бы они были отдельными классами:
class Normal() {
private var name: String = "Vilpe89"
}
class Greeting() {
private var greeting: String = "Hello "
fun printName(normal : Normal) {
println("$greeting ${normal.name}!") // This won't compile, because
// Greeting can't see normal.name
// if it's private.
}
}