1.类与对象
- 创建Kotlin对象
与创建Java对象完全一致
//类的定义
class person {
var name = ""
var age = 0
fun eat(){
println(name + " is eating.He is "+ age + " year old.")
}
}
//调用创建对象
fun main(){
val p = person()
p.name = "Jack"
p.age = 21
p.eat()
}
2.继承与构造函数
-
open 关键字
使得父类可以被继承,默认在kotlin中除了抽象的类以外都默认是不可继承的 -
主构造函数
特点:
1. 每个类都会有一个不带参数的主构造函数
2. 可以显式的直接在后面指明参数并在进行实例化时进行赋值 val student1 = student(“www”,21)
class student(val sno :String,val grade : Int) : person(){// : 关键字相当于java中的extends
init {//studnet的主函数的函数体
//后面的person()是调用studnet的父类无参主构造方法
println("sno is "+sno)
println("grade is "+grade)
}
}
3. 在进行继承时,同Java一样,子类进行实例化的时候需要调用父类的主构造方法
//修改后的person类
open class person(val name:String,val age :Int) {//open关键字 允许被继承
fun eat(){
println(name + " is eating.He is "+ age + " year old.")
}
}
//修改后的student类
class student(val sno:String,val grade:Int,name:String,age:Int) : person(name,age){
//调用person的有参构造方法,并将参数进行带入
//问题一:为什么studnet中的name,age 不用加 val
//解释:因为在kotlin中如果在一个主构造方法中加上 val等 及等价为这个属性为调用的类所私有的属性
//即若将name,age 加上val 则name,age为studnet的私有属性
init {
println("sno is "+sno)
println("grade is "+grade)
}
}
- 次构造函数
实际上很少用次构造函数,我看着块有点迷糊
特点
1. kotlin规定当一个类同时有主次构造函数时,所有的次构造函数必须调用主构造函数(包括间接调用)
2. 主构造函数在一个类中仅能有一个,次构造函数可以有多个
3. 次构造函数是通过constructor关键字定义的
4. 可以仅通过次要构造方法进行创建对象
5. 类中可以仅有次要构造函数,没有主构造函数
class student(val sno:String,val grade:Int,name:String,age:Int) : person(name,age){// : 关键字相当于java中的extends
constructor(name: String,age: Int):this("",0,name,age){
//必须调用主构造方法 this("",0,name,age)
}
//第二个次要构造函数是通过调用第一个次要构造函数 并间接的通过第一个次要构造函数进行调用主构造函数
constructor():this("",0){
}
}
现在可以通过三种方式创建对象
val student1 = student()//通过第二个次要构造函数
val student2 = student("Jack",11)//通过第一个次要构造函数
val studnet3 = student("101",100,"www",12)//通过主构造函数
没有主构造方法
class student : person{
constructor(name:String,age:Int):super(name,age){
}
}
//由于没有主构造函数,次构造函数直接调用父类的构造函数
//super与Java中意义一致