Путь к изучению Kotlin (4): классы, конструкторы, объекты

предисловие

Существует большая разница между классами kotlin и классами Java, и это также является предметом изучения kotlin.Ниже приводится введение классов kotlin и связанных с ними знаний.

1. Переменные и методы класса и члена

1.1 Модификаторы доступа

Друзья, знакомые с Java, должны знать, что в Java есть такие модификаторы доступа: private, default (по умолчанию), protected, public.
Ниже приведена таблица модификаторов доступа Java:

модификатор доступа тот же класс тот же пакет Подкласс в любом месте
частный да нет нет нет
по умолчанию (по умолчанию) да да нет нет
защищенный да да да нет
публичный да да да да
(Да: доступно, Нет: недоступно)

Так что насчет модификаторов доступа kotlin?
В kotlin меняем дефолт (по умолчанию) на публичный, и добавляем внутренний, а остальные такие же, как в Java.

Ниже приведена таблица модификаторов доступа kotlin:

модификатор доступа тот же класс тот же пакет Подкласс тот же модуль в любом месте
частный да нет нет нет нет
защищенный да да да нет нет
внутренний да да да да нет
публичный (по умолчанию) да да да да да

Для модификатора класса необходимо подчеркнуть:

  1. internal, областью действия этого модификатора является модуль.Так называемый модуль может рассматриваться как компонент, сторонний пакет поддержки, а переменные или классы, модифицированные с помощью internal, не могут использоваться другими модулями.
  2. Класс class по умолчанию (без каких-либо модификаторов) public final, что означает, что по умолчанию, 1. Класс является общедоступным и может быть доступен другим классам, 2. Класс не может быть унаследован .

1.2 Классы и объекты

Ниже приведен самый простой класс

// 定义了一个Person类
// kotlin默认访问权限修饰符就是public
class Person {
    
    
}

fun main(){
    
    
    val person = Person() // 创建一个Person对象
    // val person0:Person = Person() // 带类型的声明
    println(person) // person对象
}

Создание объектов в kotlin намного проще, чем в Java, и даже ключевое слово new не нужно писать.

1.3 Переменные-члены и методы-члены

class Person {
    
    
	// 成员变量
    var name:String = "Jack"
    var age:Int = 23
    
    // 只读
    val id = 1001
	
	// 成员函数
    fun eat(food:String){
    
    
        println("eat $food")
    }
}

fun main(){
    
    
    val person = Person()
//  var person = Person() // 创建一个只读的Person对象
    println(person.name)
    println(person.age)
    println(person.id)
    person.eat("rice");
}

выход:

Jack
23
1001
eat rice

В приведенном выше примере кода и переменные-члены, и методы-члены являются общедоступными, поэтому их можно вызывать непосредственно в основной функции. Читатели также могут попытаться перейти на частный, чтобы изменить.

2. Конструктор

Между конструктором Kotlin и конструктором Java все еще существует большой разрыв.Конструктор Kotlin в основном делится на первичный конструктор и вторичный конструктор, которые будут представлены один за другим ниже.

2.1 Основной конструктор

Kotlin, как и Java, имеет конструктор по умолчанию, который не принимает аргументов. Если параметры указаны, общая запись выглядит следующим образом:

Общий способ написания первичного конструктора с параметрами выглядит следующим образом:

// 自动创建同名的成员变量name和age,同时默认是public属性的
class Person constructor(var name:String, var age:Int){
    
    
}

fun main(){
    
    
    val person = Person("Jack", 23)
    println("name is ${
      
      person.name} age is ${
      
      person.age}")
}

выход:

name is Jack age is 23

Есть несколько вещей, которые следует отметить в приведенном выше коде:

  1. constructor(var name:String, var age:Int)Это основной конструктор этого класса. constructorКлючевые слова можно не указывать.
  2. Среди них var name:String, var age:Intв классе будет автоматически создана переменная-член с таким же именем ( valмодифицированная — такая же), а инициализированное значение — значение параметра конструктора.
  3. Для параметров основного конструктора var name:String, var age:Int. Если не добавить var, переменная-член с тем же именем не будет создана, а будет представлять только параметры функции.

Любой, кто писал на Java, знает, что классы Java можно инициализировать в теле функции конструктора:

public class Person {
    
    
    public Person() {
    
    
    	// 构造函数的函数体,这个可以省略
    }
}

Так есть ли у Kotlin аналогичная функциональность? Ответ - да! Это требует введения в использование Kotlin init{}.

class Person constructor(name:String, age:Int){
    
    
	// 成员变量
    var mName:String = ""
    var mAge:Int = -1;
    // init代码块
    init {
    
    
    	// 类似Java构造函数体
        mName = name
        mAge = age
        // 其他的初始化过程
    }
}

fun main(){
    
    
    val person = Person("Jack", 23)
    println("name is ${
      
      person.mName} age is ${
      
      person.mAge}")
}

Приведенный выше пример является правильным init{}использованием, вы можете init{}реализовать в нем функцию инициализации класса, точно так же, как используя тело функции конструктора Java.

Как упоминалось ранее, для упрощения основного кода конструктора Kotlin constructorможно опустить в качестве ключевого слова:

class Person(var name:String, var age:Int){
    
    
}

Это может сделать код более кратким. Конечно, ключевые слова конструктора main constructorне бесполезны, когда вам нужно добавить права доступа к конструктору, вам нужно добавить его constructor.

// 直接将构造函数修饰为private
class Person private constructor(var name:String, var age:Int){
    
    
}

fun main(){
    
    
	// 由于设置构造函数为privae,无法创建对象。
    val person = Person("Jack", 23) // 报错
    println("name is ${
      
      person.name} age is ${
      
      person.age}")
}

Поскольку главный конструктор может добавлять модификаторы доступа, также можно добавить имя и возраст переменных-членов:

// 相当于成员变量name和age设置为private
class Person constructor(private var name:String, private var age:Int){
    
    
}

fun main(){
    
    
    val person = Person("Jack", 23)
    // 由于成员变量name和age设置为private,所以这里报错
    println("name is ${
      
      person.name} age is ${
      
      person.age}")
}

Выше показано, как использовать главный конструктор. Через приведенный выше пример вы можете заключить предложение. В Kotlin главный конструктор является точкой входа класса .

2.2 Второстепенные конструкторы

Для Java мы знаем, что конструктор может быть перегружен, и то же самое верно для kotlin, существует перегрузка конструктора, который является вторичным конструктором.

class Person (var name:String, var age:Int){
    
    

    // 次构造函数
    constructor(name: String):this(name, 22)

    // 次构造函数
    constructor(age: Int):this("Jack", age)
    
// private constructor(age: Int):this("Jack", age)
}

fun main(){
    
    
    val person0 = Person("Jack")
    println("name is ${
      
      person0.name} age is ${
      
      person0.age}")

    val person1 = Person(23)
    println("name is ${
      
      person1.name} age is ${
      
      person1.age}")
}

Как и перед первичным конструктором, перед вторичным конструктором может стоять модификатор доступа.
Существует очень важное правило для вторичного конструктора, то есть вторичный конструктор должен прямо или косвенно вызывать первичный конструктор.Следующий
код является неправильным примером:

class Person (var name:String, var age:Int){
    
    

    // 次构造函数
    constructor(name: String):this(name, 22)

    // 次构造函数
    constructor(age: Int) // 报错
}

Эта ошибка возникает, если вторичный конструктор не вызывает первичный конструктор.Primary constructor call expected

3. это ключевое слово

thisКлючевые слова В дополнение к указанным выше, используемым для указания на первичный конструктор, thisключевые слова также представляют объекты текущего класса.

/**
 * 这里的this都代表当前类的对象
 */
class Person (name:String, age:Int){
    
    
    var name:String = "name"
    var age:Int = 22
    init {
    
    
        this.name = name
        this.age = age
    }

    fun selfIntroduce(){
    
    
    	// 这里也可以省略this
        println("I am ${
      
      this.name}, ${
      
      this.age} years old")
    }
}

fun main(){
    
    
    val person = Person("Jack", 23)
    person.selfIntroduce()
}

выход:

I am Jack, 23 years old

Еще одно использование this - с квалификатором.Это this@xxxиспользование в основном используется для анонимных классов и внутренних классов и будет дополнено позже при введении анонимных классов и внутренних классов.

Заканчивать

Вышеизложенное посвящено простому использованию и внедрению классов, конструкторов и объектов kotlin Добро пожаловать, исправляйте ошибки и делитесь ими.

рекомендация

отblog.csdn.net/RQ997832/article/details/122890951