目录
前言
kotlin被google官方认为是android开发的一级编程语言
今天,我将主要讲解kotlin中的类的所有知识,主要内容包括如下:
1. 类的声明 & 实例化
// 格式 class 类名(参数名1:参数类型,参数名2:参数类型...){ // to do } // 示例 class user(username: string, age: int){ // to do } // 实例化 // kotlin没有new关键字,所以直接创建类的实例(无参情况 & 有参): var user = user() var user = user("abc" , 123) // 额外说明:kotlin支持默认参数 // 即在调用函数时可不指定参数,则使用默认函数 class user(username: string = "hjc", age: int = 26){ // to do } // 在实例化类时不传入参数,username默认 = hjc,age默认 = 26 var user = user() // 在设置默认值后,若不想用默认值可在创建实例时传入参数 var user = user("abc" , 123) // 注:命名参数 若一个默认参数在一个无默认值的参数前,那么该默认值只能通过使用命名参数调用该函数来使用 class user(username: string = "hjc", age: int){ // to do } var user = user(age = 26)
对于构造函数,kotlin中类可有一个主构造函数 & 多个次构造函数,下面将详细说明。
2. 构造函数
2.1 主构造函数
- 属于类头的一部分 = 跟在类名后,采用 constructor 关键字
- 不能包含任何的代码。初始化的代码放到以 init 关键字作为前缀的代码块中
class 类名 constructor(参数名:参数类型){ init { //... } } // 示例 class user constructor(username: string) { init { //... } } // 注:若主构造函数无任何注解 / 可见性修饰符,可省略 constructor 关键字 class 类名(参数名:参数类型){ init { //... } } // 示例 class user (username: string) { init { //... } }
2.2 次构造函数
- 必须加constructor关键字
- 一个类中可存在多个次构造函数,传入参数不同
// 形式 constructor(参数名:参数类型) :{函数体} // 示例 class user(username: string) { // 主构造函数 init { println(username) } // 次构造函数1:可通过this调主构造函数 constructor() : this("hjc") // 次构造函数2:可通过this调主构造函数 constructor(age: int) : this("hjc") { println(age) } // 次构造函数3:通过this调主构造函数 constructor(sex: string, age: int) : this("hjc") { println("$sex$age") } } // 实例化类 user("hjc") // 调用主构造函数 user() // 调用次构造函数1 user(2) // 调用次构造函数2 user("male",26) // 调用次构造函数3
3. 类的属性
kotlin的类可以拥有属性:关键字var(读写) / 关键字val(只读)
class user { var username: string val sex: string = "男" } // 使用属性 = 名称 引用 user().sex // 使用该属性 = java的getter方法 user().username = "hjc" // 设置该属性 = java的setter方法
4. 可见性修饰符
5. 继承 & 重写
- 类似于java,kotlin是单继承 = 只有一个父类
- 区别:kotlin使用冒号“ : ”继承 & 默认不允许继承(若想让类可被继承,需用open关键字来标识)
// 用open关键字标识该类允许被继承 open class food // 类fruits继承类food class fruits : food()
- 对于子类重写父类的方法,在kotlin中,方法也是默认不可重写的
- 若子类要重写父类中的方法,则需在父类的方法前面加open关键字,然后在子类重写的方法前加override关键字
// 父类 // 在类 & 方法前都加了关键字open,为了被继承 & 方法重写 open class food { open fun banana() {} } // 子类 class fruits : food(){ // 重写了父类的方法 override fun banana() { super.banana() } }
6. 特殊类
下面将讲解一些特殊的类:
- 嵌套类(内部类)
- 接口
- 数据类
- 枚举类
6.1 嵌套类(内部类)
/** * 1. 嵌套类(内部类) * 标识:关键字inner * 使用:通过外部类的实例调用嵌套类 */ class user { var age: int = 0 inner class username { } } var username: user.username = user().username()
6.2 接口
/** * 2. 接口 * 标识:关键字interface */ // 声明 interface a{} interface b{} // 方法体 // 接口中的方法可以有默认方法体,有默认方法体的方法可不重写 // 区别于java:java不支持接口里的方法有方法体。 interface userimpl{ fun getname(): string // 无默认方法体,必须重写 fun getage(): int{ // 有默认方法体,可不重写 return 22 } } // 实现接口userimpl:需重写getname() & 可不重写getage() class user :userimpl{ override fun getname(): string { return "hjc" } } // 实现接口:冒号: class food : a, b {} // kotlin是多实现 class fruits: food,a, b {} // 继承 实现接口
6.3 数据类
/** * 3. 数据类 * 作用:保存数据 * 标识:关键字data */ // 使用:创建类时会自动创建以下方法: // 1. getter/setter方法; // 2. equals() / hashcode() 对; // 3. tostring() :输出"类名(参数 参数值)"; // 4. copy() 函数:复制一个对象&改变它的一些属性,但其余部分保持不变 // 示例: // 声明1个数据类 data class user(var username: string, var age: int) // copy函数使用 var user = user("hjc",26) var user1 = user.copy(age = 30) // 输出user1.tostring(),结果是:user(username=hjc,age=30) // 特别注意 // 1. 主构造方法至少要有一个参数,且参数必须标记为val或var // 2. 数据类不能用open、abstract、sealed(封闭类)、inner标识
6.4 枚举类
/** * 4. 枚举类 * 标识:关键字enum */ // 定义 enum class color { red, green, blue } // 为枚举类指定值 enum class color(rgb: int) { red(0xff0000), green(0x00ff00), blue(0x0000ff) }
总结
本文全面介绍了kotlin语法中的类,更多关于android kotlin类语法的资料请关注其它相关文章!