kotlin(八)类和对象

Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行

类定义

一、类和对象
1.1 前言
        Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。

1.2 定义类
        使用 Kotlin 创建第一个类,咱描述的详细一点。

Kotlin 类可以包含:

构造函数和初始化代码块

函数(方法)

属性(字段)

嵌套类(内部类)

对象声明。

Kotlin 中使用关键字 class 声明类,后面紧跟类名
 

/**
 * kotlin 类和对象
 */
class ClsClass {

    //定义属性
    var name:String =""
    var age:Int =0
    //定义方法
    fun info():Unit{
        println("$name 今年已经$age")
    }

}

类的属性

属性定义

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

不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)

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

class Test{

lateinit var a: String
lateinit 对应使用var来声明属性
lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)

1.3 field  val不允许设置setter函数,因为它是只读的
        针对你定义的每一个属性,Kotlin都会产生一个field、一个getter、以及一个setter,field用来存储属性数据,你不能直接定义field,Kotlin会封装field,保护它里面的数据,只暴露给getter和setter使用。

        field使用场景:当你需要覆盖Kotlin自动生成的getter和setter时使用。

    var age:Int =0
           get() = field+20
            set(value) {
               field = value+6
                println(field)
            }
   
   age =1
   println(age)// 27

我们可以像使用普通函数那样使用构造函数创建类实例:  Kotlin 中没有 new 关键字

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

    println("   ________________kotlin 类的使用__________________")
    var cls =ClsClass()
    cls.name="dawei"
    cls.info()

1.4 构造函数

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

class Person constructor(firstName: String) {}

1.4.1 主构造器

       

        我们在UserInfo类的定义头中定义一个主构造函数,使用临时变量为UserInfo的各个属性提供初始值,在Kotlin中,为便于识别,临时变量(包括仅引用一次的参数),通常都会以下划线开头的名字命名

如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的注解和修饰符要放在它之前,如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。

class Person(_firstName: String) {
}

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

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

主构造函数定义属性

        Kotlin允许你不使用临时变量赋值,而是直接用一个定义同时指定参数和类属性,这种方式定义类属性,可以减少重复代码。

class UserInfo2(var name:String, _age:Int)  {
    var age = _age
}

次构造函数

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

        我们可以定义多个次构造函数来配置不同的参数组合

        同时,可以使用次构造函数,定义初始化代码逻辑

        在同一个类中代理另一个构造函数使用 this 关键字

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

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

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

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

class DontCreateMe private constructor () {
}

1.4.3 初始化顺序

  • 1、主构造函数里声明的属性

  • 2、类级别的属性赋值

  • 3、init初始化块里的属性赋值和函数调用

  • 4、次构造函数里的属性赋值和函数调用

class UserInfo2(var name: String, _age: Int) {
 
    var age = _age
    var isMan = false//设置默认参数。
 
    init {
        println("初始化:$name 今年已经$age 岁了,$isMan")
    }
    //次构造器
    constructor(name: String, _isMan: Boolean) : this(name, _age = 21) {
        this.name = "$name,BOOM"
        isMan = _isMan
        println("次构造器:$name 今年已经$age 岁了,$isMan")
    }
}
 
fun main() {
    //初始化顺序
    UserInfo2("顺讯",true)
}

二、类的修饰符(类别)
        Kotlin 类的修饰符包括 classModifier 和 accessModifier

2.1 classModifier
        类属性修饰符,标示类本身特性(类别)

abstract    // 抽象类  
final       // 类不可继承,默认属性
enum        // 枚举类
open        // 类可继承,类默认是final的
annotation  // 注解类
data        // 数据类
sealed      // 密封类
object      // 单例类


2.2 accessModifier
        访问权限修饰符

        Kotlin与Java可见性修饰符对比

修饰符                            Java                                      Kotlin
public                          所有类可见                           所有类可见(默认)
private                       当前类可见                        当前类可见
protected   当前类、子类、同一包路径下的类可见    当前类、子类可见
default          同一包路径下的类可见(默认)                       无
internal        无                                                同一模块中的类可见
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值