Kotlin 类和对象

今天学习到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更多针对成员变量和成员方法来限制的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值