今天学习到Kotlin 的类和对象来了,准备今天学习完准备结束Kotlin基础语法部分,开始准备开始Kotlin 开源项目,项目实战
创建一个类
//不带参数
class Student{
var name:String=""
var age:String=""
}
//带参数
class Student1(sex:String){
var name:String=""
var age:String=""
}
实例一个对象,在Kotlin 中是没有new 关键字的
var student=Student()
student.age
类的set/get方法
在Java中,类是有get set方法的在Kotlin 也存在,但是Java是为了保护变量与赋值,所以会存在get或者set方法,在Kotlin中,操作变量是可以直接对象.变量出来进行操作的,当然我们也是可以学习下Kotlin 中的set/get用法
class Person {
var lastName: String = "zhang"
get() = field.toUpperCase() // 将变量赋值后转换为大写
set
var no: Int = 100
get() = field // 后端变量
set(value) {
if (value < 10) { // 如果传入的值小于 10 返回该值
field = value
} else {
field = -1 // 如果传入的值大于等于 10 返回 -1
}
}
var heiht: Float = 145.4f
private set
}
// 测试
fun main(args: Array<String>) {
var person: Person = Person()
person.lastName = "wang"
println("lastName:${person.lastName}")
person.no = 9
println("no:${person.no}")
person.no = 20
println("no:${person.no}")
}
输出结果
lastName:WANG
no:9
no:-1
主构造器和次构造器
在Java中我们只会存在主构造器函数方法,但是Kotlin 有主次之分,我们一起来学习下吧
正常情况下我们创建一个类,需要用到constructor关键字来声明,构造函数,但是在没有特殊情况是可以省略的,init {}类似我们的静态代码块,在
class Person constructor(firstName: String) {
init {
println("FirstName is $firstName")
}
}
class Person(firstName: String) {
init {
println("FirstName is $firstName")
}
}
如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。
次构造器
如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) {
constructor (name: String, age:Int) : this(name) {
// 初始化...
}
}
主次构造器优先级
class Runoob constructor(name: String) { // 类名为 Runoob
// 大括号内是类体构成
var url: String = "http://www.runoob.com"
var country: String = "CN"
var siteName = name
init {
println("初始化网站名: ${name}")
}
// 次构造函数
constructor (name: String, alexa: Int) : this(name) {
println("Alexa 排名 $alexa")
}
fun printTest() {
println("我是类的函数")
}
}
fun main(args: Array<String>) {
val runoob = Runoob("菜鸟教程", 10000)
println(runoob.siteName)
println(runoob.url)
println(runoob.country)
runoob.printTest()
}
输出结果为:
可以看到init初始化代码块,优先级最高,然后就是次代码块,声明次构造函数,那么在对象实例化时候可以传多个参数
初始化网站名: 菜鸟教程
Alexa 排名 10000
菜鸟教程
http://www.runoob.com
CN
我是类的函数
类的修饰符
类的修饰符包括 classModifier 和_accessModifier_:
- classModifier: 类属性修饰符,标示类本身特性。
abstract // 抽象类
final // 类不可继承,默认属性
enum // 枚举类
open // 类可继承,类默认是final的
annotation // 注解类
- accessModifier: 访问权限修饰符
private // 仅在同一个文件中可见
protected // 同一个文件中或子类可见
public // 所有调用的地方都可见
internal // 同一个模块中可见
总结类能不能被继承final/final或者能不能访问是两回事,而且被classModifier修饰过的应该都是隐性声明可以被公开访问,所以不用特别public修饰一下,accessModifier更多针对成员变量和成员方法来限制的