Kotlin 类与对象之构造函数(四)

关键字:Class

构造函数

  • 主构造函数
  • 次构造函数
主构造函数

只能有一个主构造函数,主构造函数为类头的一部分:在类名之后

class Person constructor(firstName: String) { ... }

主构造函数不能包含任何代码,初始化的代码可以放到以 init 关键字作为前缀的初始化块

class test(arg : Int){
    init{
        println("init Data,data is $arg")
    }
}
  • 若初始化代码块和属性赋值同时交叉出现,则按顺序执行
  • 构造函数有注解或可见性修饰符,则 constructor 关键字是必需的
次构造函数

每个次构造函数都需要委托给主构造函数

class Person (name : String) {    
    var pName = name   // 赋值
    var area = "GD"    // 初始化
    
    // 次构造函数
    constructor(name: String,area : String):this(name){ 
        this.area = area 
    }   
    
    // 初始化代码块 是主构造函数的一部分,
    //所有初始化块中的代码都会在次构造函数体之前执行
    init {  
        println("Init Data,data is $name") 
    }  
    
    fun printName(){  //函数一
        println("Name is $pName")  
    }  
    fun printArea(){ //函数二
      println("Area is $area")  
    }
}

测试:

fun main(args:Array<String>){  
    var person = Person("long","GX")    
    var person2 = Person("integer") 
    println("***************************")   
    person.printName()  
    person.printArea()  
    println("***************************")   
    person2.printName() 
    person2.printArea() 
    println("***************************") 
    println("Get Area : ${person2.area}")
    // var 默认实现了getter和 setter,直接调用/赋值
}

输出:

Init Data,data is long
Init Data,data is integer
***************************
Name is long
Area is GX
***************************
Name is integer
Area is GD
***************************
Get Area : GD

继承

kotlin中所有的类都有一个共同的超类 Any,但是Any不同于Object,他只有equals()、hashCode() 与 toString()

允许定义的类可以被继承:open关键字

open class Person (name : String) {
       ...
       constructor(name: String,area : String):this(name){    
       this.area = area    
       printName()
}


 }
class Student(var grade:Int,name :String,area:String) : Person(name,area) { 
    init { 
        println("Grade is $grade") 
    }
}
  • kotlin 里面继承的关键字是“:”
  • 构造函数里面的参数带了 var、val 即为全局变量
  • 子类中的构造函数必须得调用父类中的构造函数< : Person(name,area) >
    代表调用父类Person的一个次构造函数
  • 没有主构造函数的时候,定义了次构造函数,次构造函数也需要调用父构造函数
class Student : Person {  
   constructor():super("zero","SZ"){}
   
   constructor(area:String):super("zero",area){}
  
}

简单来说,:就是类似于extends;后面的括号在继承是调用了父类的构造函数,当没有主构造函数时,可以省略

资料参考、学习

发布了27 篇原创文章 · 获赞 6 · 访问量 1658

猜你喜欢

转载自blog.csdn.net/weixin_41802023/article/details/100867401