kotlin-2-类

1、kotlin 可见性修饰符

Java有四种:

  • public:包内及包外的任何类均可以访问
  • protected:包内的任何类,及包外的那些继承了此类的子类才能访问
  • 默认:包内的任何类都可以访问它,包外的任何类都不能访问
  • private:包内包外的任何类均不能访问

Kotlin也是有四种:

  • public:默认值,什么都不写表示是public。
  • protected:和Java不同的是,即使在同一个包内,也不能访问protected方法。比private多了子类可以调用这一范围。
  • internal:所在的整个 module 可见
  • private:只在这个类内部可见。
2、kotlin 主构造函数

主构造函数 写在类头中 如果你不希望别的类访问到这个变量,可以用private修饰

class Person constructor(firstName: String) {
}

如果主构造函数没有注解或可见性说明,则 constructor 关键字是可以省略:
class Person (firstName: String) {
}

如果构造函数有注解或可见性声明,则 constructor 关键字是不可少的,并且可见性应该在前
class Customer public @inject constructor (name: String) {...}

主构造函数不能包含任意代码。初始化代码可以放在以 init 做前缀的初始化块内
class Person (firstName: String) {
  init {
        logger,info("Customer initialized with value ${firstName}")
    }
}

总结

  • 主构造函数 constructor写在类头中 ,没有修饰符或者注解修饰可以省略constructor关键字
  • 主构造函数中,如果参数加var会自动生成对应的属性
  • 主构造函数中,如果你不希望别的类访问到这个变量,可以用private修饰
  • init代码块也属于主构造器的一部分,也可以引用主构造函数中的变量
  • 如果没有主构造函数,也会隐式地创建一个无参构造函数,
  • 创建对象不需要 new
3、kotlin 次构造函数

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

  • 次级构造函数不能直接将参数转换为属性(不能加var)
  • 如果有主构造器,那么次构造器必须直接或者间接引用到主构造器
    在同一个类中代理另一个构造函数使用 this 关键字:
class Person(var firstName: String) {

    init {
        println("Customer initialized with value ${firstName}")
    }
    //var firstName: String? = null

    constructor() : this("Xiao ming")

    //不能直接将参数转换为字段,
    constructor(firstName: String, lastName: String) : this(firstName) {
        this.lastName = lastName
    }

    var lastName: String? = null

}
4、 重写get set方法

声明一个属性的完整语法是
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]

其初始器(initializer)、getter 和 setter 都是可选的。属性类型如果可以从初始器 (或者从其 getter 返回值,如下文所示)中推断出来,也可以省略。

var allByDefault: Int?    *错误:需要显式初始化器,隐含默认 getter 和 setter
var initialized = 1  * 类型 Int、默认 getter 和 setter

在主构造函数中 初始器(initializer) 才可以省略
class User {

    constructor(name: String, sex: Int) {
        this.name = name
        this.sex = sex
    }

    var name: String? = null
    var sex: Int? = null
        set(value) {
            // 此处 如果调用 sex 赋值 会造成死循环 sex=0
            if (0 == value) { // 正确
                sexStr = "男"
            } else {
                sexStr = "女11"
            }
        }
    var sexStr: String? = null
//        get() {
//            // 此处 如果调用 sexStr 取值 会造成死循环 if ("".equals(sexStr))
//            if (0 == sex) { // 正确
//                return "男"
//            }
//            return "女"
//        }

}

一般不需要重写get set方法,在某些特定场景下重写即可,但注意避免死循环

5、 继承

kotlin 中所有的类和方法默认都是final,不能直接继承或者重写,如果要继承或重写,需要加上open 关键字

open class Parent(var name: String) {

    var sex: String? = null

    init {
        this.name = "人"
    }

    // 没有加open关键字,不能重写
    fun showParent() {

    }

    // 加open关键字可以重写
    open fun showSelf() {

    }
}

class Child( name: String):Parent (name){

    // 没有加open关键字,不能重写
//    fun showParent(){
//
//    }
    // 重写加 override  一般写法不换行
    override  fun showSelf(){

    }
}
6、 接口

接口用关键字 interface 来定义:
个类或对象可以实现一个或多个接口

interface TestInterface {

    //可以在接口中声明属性,但属性必须是抽象的 或 提供访问实现。
    //private var name: Int   //这种写法错误
    //var name: String? = null  //这种写法错误
    var name: String
    abstract var sex: Int
    fun test()
}
class TestInterfaceImpl(override var name: String, override var sex: Int) : TestInterface {
    override fun test() {
        println(name+"--"+sex)
    }
}

接口中声明的,必须是抽象的 或 提供访问实现

7、 抽象
abstract class A {
    //abstract val  name: String ? = null   写法错误
    //val  name: String ? = null    写法正确
    abstract val  name: String     //写法正确

    //抽象类里已经提供实现的方法 要想被重写必须加open
    open fun test() {
        println(name)
    }
    abstract fun testNobody()
    //抽象类里的方法,可以不提供提供实现的时候需要用abstract关键字来描述 抽象的方法默认是open的
}
class B:A() {

    override val  name: String=""
    override fun test() {
        println(name)
    }
    override fun testNobody(){
    }
}

抽象类里,抽象的方法默认是open的,非抽象方法是final的
可以不提供提供实现的时候需要用abstract关键字来描述
抽象类里 可以有属性,属性必须是非null的或者抽象的

8、可以使用默认参数来实现java重载类似的功能
    //函数参数可以设置默认值,当参数被忽略时会使用默认值。这样相比其他语言可以减少重载
    fun reformat(name: String, sex: Boolean = true,age: Int= 18) {

    }
    reformat("TOM")
    reformat("Tom", true, 18)
9、data

在Kotlin中一些只保存数据的类,称为数据类(data class),
为了确保自动生成的代码一致性和有意义,数据类(data class)必须满足以下要求:

  • 主构造函数至少有一个参数;
  • 主构造函数的所有参数需标记为val 或 var;
  • 数据类不能是抽象、开放、密封或者内部的;

编译器会为数据类(data class)自动生成以下函数:

  • equals()/hashCode()
  • toString() 默认输出"User(name=John, age=42)"
  • componentN() 按声明顺序对应于所有属性
  • copy()
10、copy
  • 当要复制一个对象,只改变一些属性,但其余不变,copy()就是为此而生:
        data class DataUser(val name: String, val age: Int)
        val u = DataUser(name = "lioil", age = 1)
        val u1 = u.copy("win")   //传递第一参数,第二参数默认
        val u2 = u.copy("win",2) //传递所有参数
        val u3 = u.copy(age = 3) //命名参数,传递指定参数
        println("$u1,$u2,$u3")

DataUser(name=win, age=1),DataUser(name=win, age=2),DataUser(name=lioil, age=3)
11、apply
  • apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象
data class DataUser(val name: String, var age: Int){
    fun test (){
        println("test")
    }
}

val u = DataUser(name = "lioil", age = 1)
val u1 =  u.apply {
       age = 15
       test()
}
println("$u1")

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

推荐阅读更多精彩内容