Kotlin面向对象

一、有主构造函数和次构造函数

第一步:使得Person类可继承,添加open关键字

第二步:Student子类使用主构造函数继承父类Person

注意:主构造函数是没有函数体的,直接定义在类名后面

package com.shellway.helloworld

open class Person {
    var name = ""
    var age = 0

    fun eat(){
        println("name = $name , age = $age")
    }
}
package com.shellway.helloworld


class Student(var stuNo :Int , var grade : Int) : Person() {

}

fun main (){
    var student = Student(1001,3)
    println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
    student.eat()
}

主构造函数没有函数体,那我想在构造函数中写一些逻辑怎么办?kotlin提供了init结构体

package com.shellway.helloworld


class Student(var stuNo :Int , var grade : Int) : Person() {
      init {
          println("stuNo is $stuNo" )
          println("grade is $grade")
      }
}

fun main (){
    var student = Student(1001,3)
    //println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
    student.eat()
}

打印结果:
stuNo is 1001
grade is 3
name =  , age = 0

主构造函数没有函数体,那如果我们要调用父类的构造函数呢?在init中可以调用,但是不推荐,因为大多数时候我们并不需要写init结构体的,kotlin为此另外设计了一种办法。就是在继承的时候通过括号来指定。

所以在这里将Person改造下:   同时子类也必须加上,因为父类有的,子类也必须有

注意:在子类中不能将父类的参数声明成val或者var,否则就会成为子类的字段,这样跟父类的字段造成冲突。

package com.shellway.helloworld

open class Person(var name:String , var age : Int){
    fun eat(){
        println("name = $name , age = $age")
    }
}
package com.shellway.helloworld

class Student(var stuNo :Int , var grade : Int , name:String, age:Int) : Person(name,age) {
      init {
          println("stuNo is $stuNo")
          println("grade is $grade")
      }
}

fun main (){
    var student = Student(1001,3,"Jerry",23)
    //println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
    student.eat()
}

次构造函数

注意:它必须调用自己的主构造函数,使用this关键字来调用

package com.shellway.helloworld

class Student(var stuNo :Int , var grade : Int , name:String, age:Int) : Person(name,age) {
    constructor(name: String,age: Int) : this (1002,3,name,age){}
    constructor():this("Jim",10){}
}

fun main (){
    var student1 = Student()
    var student2 = Student("Jerry",20)
    var student3 = Student(1003,3,"Jack",30)
    student1.eat()
    student2.eat()
    student3.eat()
}

打印结果:
name = Jim , age = 10
name = Jerry , age = 20
name = Jack , age = 30

还有一种情况,就是子类只有次构造函数,没有主构造函数。那么这时候就不需要在子类名后面添加括号了,连父类的也省了。所以,在次构造函数中就直接调用父类的构造函数了,使用关键字super

package com.shellway.helloworld

class Student: Person{
    constructor():super("Jim",10){}
}

fun main (){
    var student = Student()
    student.eat()
}

打印结果:
name = Jim , age = 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值