kotlin基础 可见修饰词和扩展以及数据类(五)

可见修饰词

当在包中时
– 如果没有指明任何可见性修饰词,默认使用 public ,这意味着你的声明在任何地方都可见;
– 如果你声明为 private ,则只在包含声明的文件中可见;
– 如果用 internal 声明,则在同一模块中的任何地方可见;
– protected 在 “top-level” 中不可以使用

当在类中声明成员时:
private 只在该类(以及它的成员)中可见
protected 和 private 一样但在子类中也可见
internal 在本模块的所有可以访问到声明区域的均可以访问该类的所有 internal 成员
public 任何地方可见

外部类不可以访问内部类的 private 成员。

Kotlin 支持函数扩展和属性扩展。

函数扩展
为了声明一个函数扩展,我们需要在函数前加一个接收者类型作为前缀
在扩展函数中的 this 关键字对应接收者对象。

fun MutableList<Int>.swap(x: Int, y: Int) {
    val tmp = this[x] // this 对应 list
    this[x] = this[y]
    this[y] = tmp
}
在扩展函数中的 this 关键字对应接收者对象。现在我们可以在任何 MutableList<Int> 实例中使用这个函数了:

val l = mutableListOf(1, 2, 3)
l.swap(0, 2)// 在 `swap()` 函数中 `this` 持有的值是 `l`

扩展是被静态解析的
只是让这个类的实例对象能够通过.调用新的函数。

属性扩展
和函数类似, Kotlin 也支持属性扩展:
val List.lastIndex: Int
get() = size-1
初始化函数不允许有扩展属性。扩
展属性只能够通过明确提供 getter 和 setter方法来进行定义.

伴随对象扩展
如果一个对象定义了伴随对象,你也可以给伴随对象添加扩展函数或扩展属性.

数据类

我们经常创建一个只保存数据的类。在这样的类中一些函数只是机械的对它们持有的数据
进行一些推导。在 kotlin 中这样的类称之为 data 类,用 data 标注:
data class User(val name: String, val age: Int)
注意如果构造函数参数中没有 val 或者 var ,就不会在这些函数中出现;
主构造函数应该至少有一个参数;
主构造函数的所有参数必须标注为 val 或者 var ;
数据类不能是 abstract,open,sealed,或者 inner ;
数据类不能继承其它的类(但可以实现接口)。
(在1.1之前)数据类只能实现接口。

数据类和多重声明
组件函数允许数据类在多重声明中使用:

val jane = User("jane", 35)
val (name, age) = jane
println("$name, $age years of age") //打印出 "Jane, 35 years of age"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值