专栏名称: 弦乐旋律
纯粹音乐,弦乐旋律。擦弦乐器爱好者与纯音乐爱好者的交流平台。
目录
相关文章推荐
厦门网  ·  王一博,传来喜讯! ·  19 小时前  
厦门网  ·  王一博,传来喜讯! ·  19 小时前  
麦音乐  ·  你的名字 ·  4 天前  
桂林广播电视台飞扬883  ·  拼手速!上百万人瞬间涌入,“一眨眼就没了” ·  2 天前  
桂林广播电视台飞扬883  ·  拼手速!上百万人瞬间涌入,“一眨眼就没了” ·  2 天前  
达州发布  ·  @达州人,花海音乐会来了!就在3月14日 ·  3 天前  
达州发布  ·  @达州人,花海音乐会来了!就在3月14日 ·  3 天前  
51好读  ›  专栏  ›  弦乐旋律

科技·Kotlin从入门到精通,类和对象

弦乐旋律  · 公众号  · 音乐  · 2020-05-07 10:29

正文

类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。


类定义

Kotlin类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。Kotlin中使用关键字class声明类,后面紧跟类名:

// 类名为 Runoobclass Runoob {    // 大括号内是类体构成}

我们也可以定义一个空类:

class Empty

可以在类中定义成员函数:

class Runoob() {    // 成员函数    fun foo() { print("Foo") }}


类的属性

类的属性可以用关键字var声明为可变的,否则使用只读关键字val声明为不可变。

class Runoob {    var name: String = ……    var url: String = ……    var city: String = ……}

我们可以像使用普通函数那样使用构造函数创建类实例:

// Kotlin中没有new关键字val site = Runoob()

要使用一个属性,只要用名称引用它即可

site.name // 使用.号来引用site.url

Koltin中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后:

class Person constructor(firstName: String) {}

如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。

class Person(firstName: String) {}

getter和setter

属性声明的完整语法:

var <propertyName>[: <PropertyType>] [= <property_initializer>]    [<getter>]    [<setter>]

getter和setter都是可选。如果属性类型可以从初始化语句或者类的成员函数中推断出来,那就可以省去类型,val不允许设置setter函数,因为它是只读的。

// 错误:需要一个初始化语句,默认实现了getter和setter方法var allByDefault: Int?// 类型为Int,默认实现了getter和settervar initialized = 1// 类型为Int,默认实现getter,但必须在构造函数中初始化val simple: Int?// 类型为Int类型,默认实现getterval inferredType = 1

实例

以下实例定义了一个Person类,包含两个可变变量lastName和no,lastName修改了getter方法,no修改了setter方法。

class Person {    var lastName: String = "zhang"        get() = field.toUpperCase() // 将变量赋值后转换为大写        set
var no: Int = 100 get() = field // 后端变量 set(value) { if (value < 10) { // 如果传入的值小于10返回该值 field = value } else { field = -1 // 如果传入的值大于等于10返回-1 } }
var heiht: Float = 145.4f private set}
// 测试fun main(args: Array<String>) { var person: Person = Person()
person.lastName = "wang"
println("lastName:${person.lastName}")
person.no = 9 println("no:${person.no}")
person.no = 20    println("no:${person.no}")}

输出结果为:

lastName:WANG

no:9

no:-1

Kotlin中类不能有字段。提供了BackingFields(后端变量)机制,备用字段使用field关键字声明,field关键词只能用于属性的访问器,如以上实例:

var no: Int = 100    get() = field // 后端变量    set(value) {        if (value < 10) { // 如果传入的值小于10返回该值            field = value        } else {            field = -1 // 如果传入的值大于等于10返回-1        }    }

非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟初始化的方案,使用 lateinit 关键字描述属性:

public class MyTest {    lateinit var subject: TestSubject
@SetUp fun setup() { subject = TestSubject() }
@Test fun test() { subject.method() // dereference directly }}

广告时间,休息一下


主构造器

主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用init关键字作为前缀。

class Person constructor(firstName: String) {    init {        println("FirstName is $firstName")    }}

注意:主构造器的参数可以在初始化代码段中使用,也可以在类主体n定义的属性初始化代码中使用。一种简洁语法,可以通过主构造器来定义属性并初始化属性值(可以是var或val):

class People(val firstName: String, val lastName: String) {    //...}

如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。

实例

创建一个Runoob类,并通过构造函数传入网站名:

class Runoob  constructor(name: String) {  // 类名为Runoob    // 大括号内是类体构成    var url: String = "http://www.github.com"    var country: String = "CN"    var siteName = name
init { println("初始化网站名: ${name}") }
fun printTest() { println("我是类的函数") }}
fun main(args: Array<String>) { val runoob = Runoob("菜鸟教程") println(runoob.siteName) println(runoob.url) println(runoob.country) runoob.printTest()}

输出结果为:

初始化网站名: 菜鸟教程

菜鸟教程

http://www.github.com

CN

我是类的函数


次构造函数

类也可以有二级构造函数,需要加前缀constructor

class Person {    constructor(parent: Person) {        parent.children.add(this)    }}

如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this关键字:

class Person(val name: String) {    constructor (name: String, age:Int) : this(name) {        // 初始化...    }}

如果一个非抽象类没有声明构造函数(主构造函数或次构造函数),它会产生一个没有参数的构造函数。构造函数是public。如果你不想你的类有公共的构造函数,你就得声明一个空的主构造函数:

class






请到「今天看啥」查看全文