Kotlin:那些关于 类使用 的入门语法都在这里了!


前言

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入门语法中的类使用讲解完毕。


总结

  • 本文全面介绍了Kotlin入门语法中的类
  • 接下来推出的文章,我将继续讲解Kotlin的相关知识,包括使用、语法特点等,感兴趣的读者可以继续关注我的博客哦:Carson_Ho的Android博客

请点赞!因为你们的赞同/鼓励是我写作的最大动力!

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解
Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注Carson_Ho的简书!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容