自己动手建设网站过程,网上开平台要多少钱,企业信息公共服务平台官网,网站集成支付宝教程Kotlin简介
2011年7月#xff0c;JetBrains推出Kotlin项目#xff0c;这是一个面向JVM的新语言 2012年2月#xff0c;JetBrains以Apache 2许可证开源此项目。 2016年2月15日#xff0c;Kotlin v1.0发布#xff0c;这被认为是第一个官方稳定版本。 在Google I/O 2017中JetBrains推出Kotlin项目这是一个面向JVM的新语言 2012年2月JetBrains以Apache 2许可证开源此项目。 2016年2月15日Kotlin v1.0发布这被认为是第一个官方稳定版本。 在Google I/O 2017中Google宣布在Android上为Kotlin提供最佳支持取代java成为官方开发语言。
函数和变量
kotlin中的函数和变量可以直接声明在文件中 使用fun关键字声明函数 使用var关键字声明变量可读可写变量 使用val关键字声明只读变量不可修改相当于java中的final 创建对象只需调用构造器即可不需要java中的new关键字
fun main(){var age:Int 18
}fun doubleNumber(x:Int):Int{return x*2
}声明一个数组使用arrayOf关键字
private val studyList arrayOf(语文,数学,英语)静态函数
比如工具类中常用的dp2px()
直接写在Util.kt文件中
private val displayMetrics Resources.getSystem().displayMetrics
fun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)
}那么在kotlin中调用的时候直接dp2px(15f)即可。在java中调用使用Utilkt.dp2px(15f)需要在文件名后边加上kt后缀 2. 使用object关键字声明
object Util{private val displayMetrics Resources.getSystem().displayMetricsfun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)}
}在kotlin中调用Util.dp2px(15f)在java中调用Util.INSTANCE.dp2px(15f) 使用object关键字声明相当于创建了一个类的单例对象
使用companion关键字 伴生对象 比如application
class BaseApplication : Application(){companion object{private lateinit var currentApplication: Contextfun currentApplication():Context{retun currentApplication}}override fun onCreate(){super.onCreate()currentApplication this}
}在kotlin中调用BaseApplication.currentApplication()然后在java中调用BaseApplication.Companion.currentApplication()
类
依然使用class关键字声明一个类
class User{var name:String?null//set,get方法要紧跟成员变量且里边要使用field关键字//set,get方法默认可以不写set(value){field value}get(){field}constructor(){}constructor(name: String?){this.name name}
}继承和实现接口只需要一个冒号:不同的是继承的类需要加上一个括号()。
class MainActivity:AppcompatActivity(),View.OnClickListener{...
}但是需要注意的是如果在类中显式声明了构造器就不能加上这个括号() 在调用父类的构造器或者本类中其他构造器都要使用:比如
class MyView : View {constructor(context:Context):this(context,null){}constructor(context:Context, attr:AttributeSet?):super(context,attr){}
}另外对一个类成员的setget方法的访问可以直接使用.成员变量名的方式:
user.name xxxxxx //进行赋值相当于调用了setName()方法如果是在java中去调用不能使用user.name只能使用其set,get方法。但是如果使用某一个成员变量需要在kotlin中声明这个变量的时候使用JvmField注解
JvmField
var name:String?null匿名内部类
创建一个一个匿名内部类需要object关键字 比如
call.enqueue(object:Callback){override fun onResponse(call:Call, response:Response){}override fun onFailure(call:Call, e:IOException)
}另外在内部类中使用外部类的成员变量在java中为Class.this.xx在kotlin中要使用thisClass.xx
静态内部类
静态内部类可以直接在一个类中使用class声明一个内部类这个类可以使用伴生对象如果要使用普通的嵌套内部类则需要inner class去修饰 另外internal关键字可以去修饰类和方法表示当前module可见别的module不可见
接口和抽象类枚举类
接口(interface xxx)和抽象类(abstract class xxx)的声明与java中相同 但是枚举类不一样
class SdutyList{enum class Type{MATH{...}}
}kotlin中的类默认都是被final关键字修饰的不能被继承方法不能被重写如果想要一个类可以被继承需要使用abstract关键字修饰方法需要使用open修饰才可以重写。
判断语句
if 和 when
if(code in 100..199){} //表示code是否在100到199双闭区间另外使用when关键字相当于java中的switch
when (code){//这里可以支持表达式in 100..199-{}in 200..299-{}else-{}
}遍历和循环
遍历
除了常规的for遍历一个数组或者集合
//比如有一个users的集合
var passUsers ArrayListUser()
for(user in users){if(user.age 18){passUsers.add(user)}
}
可以使用kotlin提供的操作符去简化上述代码
//使用forEach操作符
users.forEach({user:User-if(user.age 18){passUsers.add(user)}
})
//如果forEach()中接收的参数只是一个lambda表达式可以将{}提到括号外边且括号可以省略
users.forEach{user:User-if(user.age18){passUsers.add(user)}
}
//另外也可以使用类型推断不用声明user的类型
users.forEach{user-if(user.age18){passUsers.add(user)}
}
//最后如果一个lambda表达式只有一个参数那么这个参数可以省略不写而会有一个默认的隐式参数it:User
users.forEach{if(it.age18){passUsers.add(it)}
}还有这个例子中相当于过滤一些user只要符合条件的user那么可以使用filter操作符来简化
//这里直接过滤出年龄大于等于18的用户
passUsers.add(users.filter{ it.age 18 })循环
使用repeat关键字
//注意这里是一个隐式参数it:Int
repeat(100){println(it)
}for-i循环
for(i in 0..99){println(i)
}集合
使用库函数listOf()或者mapOf()使用对象
var studyList:ListLesson ArrayList();
var map:MapInt, String HashMap()但是需要注意的是上面所创建的集合元素都是不可修改的无法进行增删
所以如果需要元素可变一般使用:
arrayListOf(),mutableListOf(),mutableMapOf(),hashMapOf()var studyList:ArrayListLesson new ArrayList()
kotlin中的类系统
JavaKotlinObjectAnyvoidUnit
kotlin中基本数据类型
Kotlin基本数据类型位宽度Char(字符型)Boolean(布尔类型)Byte8(字节型)Short16(短整型)Int32(整型)Long64(长整型)Float32(浮点型)Double64(双精度浮点型)
变量的可空控制
kotlin中将变量分为可空和不可空两种类型。
//这里的user是一个不可空类型如果赋值为null则会报错
var user:User
//这里的user是一个可空类型需要加一个问号?
var user:User?null;那么如果想要调用一个可空类型的变量有两种方式
user!!.getName() //表示强制调用不管是否为null
user?.getName() //表示安全调用如果不为null才调用虽然这里可以避免空指针但是user为null肯定是有问题的希望在编写代码的时候早发现这些问题。 一个错误的示例
fun a(name:String){...
}
a(user?.getName()!!)