2020.7.15
学习目的:掌握函数的基本使用并熟悉几种类
1.普通函数
- 没有返回值 Unit等价于void,可以不写
- fun study(money:Int):Int { } 有参数,返回值类型为int
fun show(){
}
//没有返回值 Unit==void,可以不写
fun buy(money:Int):Unit{
}
fun study(money:Int):Int{
return 8888
}
- 如果函数的主体只是一句话,且其结果正是返回值,则可以简化
fun add(a:Int,b:Int)=a+b
返回值根据等号的右边结果自动推断 - 带默认值的函数
fun work(money: Int=10000,name:String,type:String="Android开发"){ }
给指定参数赋值:work(name = "小王")
//带默认值的函数
fun work(money: Int=10000,name:String,type:String="Android开发"){
}
// work(name = "小王")
-
可变参数:fun add(vararg score:Int){ }
使用vararg声明,传入的是一个整型数组,数组名为score
调用:add(1,3,4,5,6,7,7)
fun add(vararg score:Int){
var sum=0
for (value in score){
sum+=value
}
print(sum)
}
// add(1,3,4,5,6,7,7)
- 内部函数
函数的内部还可以有函数,如果一个函数的实现要分为几个板块,最好使用内部函数,很集中,并且可以相互调用
fun showView(){
fun loadData()="图片"
fun showList(){
//下载数据
val img=loadData()
//展示
println("下载的图片:$img")
}
showList()
}
//升级版showView()
fun showView2(){
fun loadData()="图片"
fun showList(){
//下载数据
loadData().also {
println("下载的图片:$it")
//it就是loadData的返回值,如此操作不需要另外用变量来接收
}
}
}
使用also关键字会更加简洁
2.数据类
存储一些基本的数据,没有其他的功能
Kotlin的数据类比java的一般类更加方便,不用提供set/get方法
数据类的使用要求
- 1.数据类的主构造函数必须有至少一个参数
- 2.参数必须使用var或val修饰
- 3.不能使用 open inner abstract 修饰
数据类自带重写的toString方法,使用also关键字轻松输出对象
data class User(var name:String,var pwd:String,var id:Int){
}
//User("小王","1234",24).also { print(it) }
3.嵌套和内部类
一.嵌套类
- 嵌套类不能使用宿主类的属性,仅仅是位置上的关系,只需要使用宿主类的类名来调用
二.内部类
- 内部类和外部类是有联系的,内部类可以使用外部类的属性,内部类依附于外部类,所以要先创建外部类的对象,才能创建内部类的对象
使用inner关键字声明
class Bank{
var money=Money(0)
//钱
class Money(var num:Int){
}
//银行卡
inner class Card(){
fun save(count:Int){
money.num+=count
}
fun withdraw(count: Int){
if(money.num>=count){
money.num-=count
println("取款成功")
}else{
println("余额不足")
}
}
}
}
//Bank.Money(200) 嵌套类的调用
//Bank().Card().save(20) 内部类的调用
4.匿名类
- 接口:接口的方法默认是open
- 匿名类格式:object:接口名{ 重写方法 }
interface OnTouchListener{
fun onTouchEvent(type:String)
}
fun didTouch(listener: OnTouchListener){
listener.onTouchEvent("手指按下")
}
//方法1:定义类实现接口->实例化这个实现类
class ButtonListener:OnTouchListener{
override fun onTouchEvent(type: String) {
println("接收到的事件为:$type")
}
}
//ButtonListener().apply { didTouch(this) }
//ButtonListener().also { didTouch(it) }
//方法2:匿名类方式
// didTouch(object:OnTouchListener{
// override fun onTouchEvent(type: String) {
// println("接收到的事件为:$type")
// }
// })
- 匿名内部类
class QQQ{
fun show(){
dispatchTouch(object :OnTouchListener{
override fun onTouchEvent(type: String) {
println("接收到的事件为:$type")
}
})
}
fun dispatchTouch(listener: OnTouchListener){
listener.onTouchEvent("手指在滑动")
}
interface OnTouchListener{
fun onTouchEvent(type:String)
}
}
5.抽象类
场景:一个界面Activity->加载->显示->结束
一个APP有多个界面,这些界面的共同之处可以抽出来形成一个模板,就是抽象类
- 抽象类里面可以定义:抽象属性 抽象方法 普通方法->有实现
- 抽象属性不能初始化,抽象方法不能实现
- 如果是子类必须实现,那么就定义为抽象方法,否则就定义为普通方法
- 如果要重写抽象类的普通方法,需要添加open
- 抽象类同样默认为open,不能实例化
abstract class BaseActivity{
abstract var title:String
init {
run()
}
fun run(){
//创建界面
onCreate()
//暂停界面
//销毁界面
}
abstract fun onCreate()
open fun onPause(){
}
fun destroy(){
}
}
class LoginActivity(override var title: String="登录"):BaseActivity(){
// override var title: String="登录" 此地也可以
override fun onCreate() {
println("开始搭建界面...")
}
override fun onPause() {
println("界面暂停了")
}
}