Kotlin学习4.6:常见类

嵌套类

Kotlin中的嵌套类是指可以嵌套在其它类中的类,该类不能访问外部类的成员,内部类指的是可以用 inner 标记以便能够访问外部类的成员。

Kotlin中的内部类与嵌套类与Java相似,不同的是在没有任何修饰的情况下,定义在一个类内部的类被默认称为嵌套类,不持有外部类的引用,如果想将它声明为一个内部类,则需要加上 inner 修饰符。

示例代码如下:

class Outer{
    var name = "wanku"
    var age = 35
    class Nested{
        fun sayHello(){
            //无法访问外部类字段
            //println("name:${name}!age:${age}")
        }
    }
}

内部类

通过上一小节的学习,我们会发现在嵌套类中是无法访问外部类中成员的,这样定义的嵌套类在实际开发中没有任何意义,为此,Kotlin提供了内部类,内部类只需要在嵌套类的基础上添加一个 inner 关键字即可,将其标识为内部类。

示例代码如下:

class Outer{
    var name = "wanku"
    var age = 35
    inner  class Nested{
        fun sayHello(){
            //访问外部类字段
            println("name:${name}!age:${age}")
        }
    }
}
fun main() {
    Outer().Nested().sayHello()
}

在这里插入图片描述

枚举类

枚举顾名思义就是一一列举,每个枚举常量都是一个对象,枚举常量用逗号分隔,枚举类的前面用 enum 关键字来修饰。

enum class Weekl{
	星期一,星期二,星期三,星期四,星期五,星期六,星期日
}

由于每个枚举常量都是枚举类的实例,因此这些实例也可以初始化,同时枚举支持构造函数,因此可以使用构造函数来初始化。

enum class Week(val what:String, val data: Int){
    monday("monday",1),
    tuesday("tuesday",2),
    wednewsday("wednewsday",3),
    thursday("thursday",4),
    friday("friday",5),
    saturday("saturday",6),
    sunday("sunday",7)
}

密封类

密封类用于表示受限制的类层次结构,当一个值只能在一个集合中取值而不能取其他值时,此时可以使用密封类。

在某种意义上。密封类是枚举类的扩展,即枚举类型的值集合。
每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。

如果想要创建一个密封类,必须满足以下两个条件:
(1)密封类必须用关键字 sealed 来修饰。
(2)由于密封类的构造函数是私有的,因此密封类的子类只能定义在密封类的内部或者同一个文件中。

示例代码如下。

sealed class Student{
    class Student1 : Student(){}
    class Student2 : Student(){}
    class Student3 : Student(){}
    class Student4 : Student(){}
}
class Student5 : Student(){}

需要注意的是,密封类的非直接继承子类可以声明在其他文件中。

数据类

在Java程序中,一般会用一些类来保存一些数据或者对象的状态,习惯上将这些类称为bean类或entity类或model类。

在Kotlin中,专门处理这些数据的类被称为数据类,用关键字 data 进行标记。

语法格式如下:

data class 类名([形参1,形参2···])

定义一个数据类时。需要注意以下几点。
(1)数据类的主构造函数至少有一个参数,如果需要一个无参的构造函数,可以将构造函数中的参数都设置为默认值。
(2)数据类中的主构造函数中传递的参数必须用 val 或 var 来修饰。
(3)数据类不可以用 abstract、open、sealed 或 inner 关键字来修饰。
(4)编译器可以自动生成一些常用方法,如 equal()、hashCode()、toString()、等, 这些方法也可以进行自定义。

在实际开发中,经常会用到数据类来存储一些数据信息,这些信息一般是通过该类的主构造函数来传递的。

示例代码如下:

data class Man(var name:String, var age:Int){}

fun main() {
    var man:Man = Man("wanuk", 20)
    println("man:$man")
}

在这里插入图片描述

单例模式

在编写程序时经常会遇到一些典型的问题或某些特定的需求,设计模式就是针对这些问题和需求的一种解决方式。

单例模式就是其中的一种。
所谓的单例模式就是在程序运行期间针对该类只存在一个实例。

就好比这个世界只有一个太阳一样,假设现在要设计一个太阳类,这该类就只能有一个实例对象,否则就违背了事实。

单例模式是通过 object 关键字来完成的,通过 object 修饰的类即为单例类,单例类在程序中有且仅有一个实例。

示例代码如下:

object Singletion{
    var name = "Singletion function"
    fun sayHello(){
        println("I am a ${name}")
    }
}

fun main() {
    Singletion.name = "single function"
    Singletion.sayHello()
}

在这里插入图片描述

伴生对象

由于在Kotlin中没有静态变量,因此它使用了半生对象来代替Java中的静态变量的作用。
伴生对象是在类加载时初始化,生命周期与该类的生命周期一致。

在Kotlin中,定义伴生对象是通过 companion 关键字标识的,由于每个类中有且仅有一个伴生对象,因此也可以不指定伴生对象的名称,并且其他对象也可以共享伴生对象。

语法格式如下:

companion object 伴生对象名称(也可以不写){
	程序代码······
}

由于伴生对象可以指定名称,也可以不指定名称。因此在调用伴生对象时分两种情况。
(1)有名称:调用方式为 “类名.伴生对象名.成员名” 或 “类名.成员名”。
(2)无名称:调用方式为 “类名.Companion.成员名” 或 “类名.成员名”。

示例代码如下。

class Company{
    companion object Factory{
        fun sayHello(){
            println("the object of Company")
        }
    }
}

fun main() {
    Company.Factory.sayHello()
    Company.sayHello()
}

在这里插入图片描述

博客为个人收集学习,供大家交流学习。
参考书籍:《Kotlin从基础到实践》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值