类和对象
- 提供默认构造函数的类
class Person constructor(){}
- 没有注解和修饰符,则construction可用省略
class Person(){}
- 有private修饰 不能省略construction
class Person private constructor(){}
- 提供默认构造函数的类
class Person(name: String,age: Int){}
注意:这个变量 name age是临时变量,只能在init或者属性初始化的时候访问 外部无法访问
- 创建对象
var xw = Person("xw",30)
- 声明构造函数的参数为成员变量 val 只提供get方法 var提供get/set方法
class Person(val name: String,val age: Int){}
var xw = Person("xw",30)
注:该变量为类的成员变量,外部不可以通过提供的set或者get方法直接访问
- 父类和子类
//父类
open class Father(name:String){}
//子类,必须调用父类的默认构造方法,有默认值jack的情况如下
class child(): Father("jack"){}
//没有默认值 可以通过子类的构造函数接收外部传递的值
class child(name:String): Father(name){}
- 属性和域 类内部定义的常量或者变量就是属性
//使用private控制外部访问
class Person{
val age: Int = 20 //内、外只能读 无法更改
var name:String = "JackChen"//内部可读可写 外部只能读
private set(value) {
field = value
}
}
- 属性判空 通常有3种方式
val len1 = wife?.length//如果为空则不执行后面操作 不空则执行
val len2 = wife!!.length//强制说wife肯定不为空
//let判空
len1.let {
//不为空则执行这个代码块
}
- 懒加载 关键字by lazy 只能作用于val
val address:String by lazy { "大街上" }//懒加载
- 延迟加载 关键字lateinit 只能作用于var
lateinit var childName:String //延迟加载
fun setup(){
childName = "jack"
}
- 函数及抽象函数
//参数没有默认值
fun add(a: Int,b :Int) = a + b
//参数是默认值的函数
fun work(money: Int = 10000,name: String = "xw"){
println("${name}学习Android开发需要${money}元")
}
//可变参数的函数
fun add(vararg array:Int){
var result = 0
for (value in array){
result += value
}
println(result)
}
抽象函数常常位于抽象类中
abstract class BaseAbs
abstract class Figure : BaseAbs() { // 1️⃣
abstract fun onDraw() // 抽象函数,无函数体 2️⃣
abstract val name: String // 抽象属性,无初始值,无getter和setter访问器 3️⃣
val cname: String = "几何图形" // 具体属性 4️⃣
fun display() = println(name) // 具体函数 5️⃣
}
抽象函数和类的具体实现
// Figure具体实现类
class Ellipse: Figure() {
override val name: String
get() = "椭圆形"
override fun onDraw() {
println("绘制椭圆形...")
}
}
class Triangle(override val name: String) : Figure() {
override fun onDraw() {
println("绘制三角形...")
}
}
class Rectangle: Figure() {
override val name: String = "矩形"
override fun onDraw() {
println("绘制矩形...")
}
}
网友评论