java语言比较稳健,久经考验,有庞大的生产代码库。然而,java裹足不前,开发者喜欢的很多现代语言高级特性,它都没有,或者迟迟加入。
kotlin从这些经验中受益良多,而java中的某些早期设计却越来越陈旧。脱胎于旧语言,kotlin解决了很多痛点,进化成一门优秀的语言。相比java,kotlin进步巨大,带来了更可靠的开发体验。
最重要的一点,google推崇kotlin,将kotlin定性为android主要开发语言,很多优秀的开源源码库均是由kotlin编写并维护。
kotlin不仅支持编写代码在虚拟机上运行,而且是一门跨平台的通用型语言,我们可以用kotlin开发各种类型的原生应用,如Android,macOS,Windows,Javascript应用。
kotlin能脱离虚拟机层,直接编译成可以在Windows,LInux和macOS平台上运行的原生二进制代码。
fun main(){ printlin("Hello World")
//如何声明一个变量
var name : String = "xiebin"
//和java语言对比 //private String name = "xiebin" println(name)
// 对比: Java 把数据类型写在了变量前面,而kotlin 把数据类型写在了变量后面。
}
var name : String = ""
可改可读 变量名 变量类型 变量赋值
Java的两大基本数据类型
1、内置数据类型:
八大基本数据类型:六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte short int long float double boolean char
2、引用数据类型:
在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。
例子:Site site = new Site("Runoob")。
String 属于引用数据类型,并不属于基本数据类型
kotlin的数据类型
kotlin的数据类型都属于引用数据类型
思考:既然kotlin都用的是引用数据类型,那么会不会对性能有影响
答:不会,因为编译器在编译kotlin的时候,会把代码转变成字节码的形式,在转换后,kotlin的引用数据类型都会转换成Java的基本数据类型。
var 标识变量可读可改
val 标识常量量只可读不可改
const (编译时常量)只能用来修饰val, 并且Const 修饰的val只能定义在top level或者在objects中。top level指的是在最外面的类的外面,表示该常量属于整个文件,而非某个类。object可以指最外面的object和companion object。
编译的字节码:
Var 定义的变量是private的,并且会生成public的get和set方法。
Val 定义的常量是private的,并且会生成public的get方法。
Const val 定义的常量生成的字节码是由 public final static 来修饰。
fun main(){
var name:String = "xiebin"
//也可以写成 var name = "xiebin" var age = 18
//这样也能运行,说明kotlin语言在进行编译的时候,有类型推断功能。能够自行推断出数据类型
//字符串模板
println("我的名字是$name 年龄$age")
}
fun main(){
val number = 10
if(number in 0..10){
println("数字在0-10之间")
}else if(number in 11..50){
println("数字在11-50之间")
}
}
Range
正向:start..end 从哪里 到 哪里
反向:end downTo start
fun main(){
for(i in 0..10){
println(i)
}
//输出 0 1 2 3 4 5 6 7 8 9 10
for(y in 10 downTo 0){
println(y)
}
//输出 10 9 8 7 6 5 4 3 2 1 0 }
when表达式相当于Java中的switch语句,但是when表达式更加强大
fun main(){
val number = 4
val star = when(number){
1-> println("这个数字是1")
2-> println("这个数字是2")
3-> println("这个数字是3")
4-> println("这个数字是4")
else -> print("没有这个数字")
}
var str = when(number){
1->"aaaa"
2->"bbbb"
3->"cccc"
4->"dddd"
else->"nonono"
}
println(str)
println(star)
}
上面代码块和Java中的switch一个意思,但是when表达式还有返回值
fun main(){
val number = 2
val str = when(number){
1->"这个数字是1"
2->"这个数字是2"
3->"这个数字是3"
4->"这个数字是4"
else ->"没有这个数字"
}
println(str)
//输出这个数字是2,说明when表达式返回了字符串”这个数字是2“
//这里也存在类型推断,我们写的是String,返回值推断出来的就是String
}
那么,如果我们返回值是不是一个数据类型,那么会出现说明情况呢
fun main(){
val number = 4
val str = when(number){
1-> println("这个数字是1")
2-> println("这个数字是2")
3-> println("这个数字是3")
4-> println("这个数字是4")
else -> print("没有这个数字")
}
println(str)
//输出kotlin.Unit unit 相当于java的void
}
fun main(){
loginMethod("xiebin","123")
//kotlin中的具名函数参数
loginMethod(userName = "xiebin",password = "123")
}
fun loginMethod(userName:String , password:String){
println("我的名字是$userName 我的密码是$password")
}
//写一个比较完整的方法
private fun login(name: String, password: String): String {
return name+password
}
//和Java不同的是,在写方法的参数的时候,Java的类型在左边,但是kotlin的类型在右边
//返回值,java的返回值在方法名前面,kotlin在参数后面
//kotlin 在方法中 是可以配置默认参数的
private fun login2(name: String ="xiebin2", password: String="密码"): String {
return name+password
}
匿名函数:顾名思义 就是没有名字的函数
fun main(){
//匿名函数,先看效果
val name = "Brad"
//Returns the length of this char sequence. 方法返回此字符串的字符长度
val count = name.count()
println(count)
//输出4l
//根据源码可以看出,此方法还是返回 int ,但是后面有个大括号。这个就是匿名函数,大括号内部,是把字符串遍历成char,内部返回值是boolean
val name2 = name.count {
println(it)
it == 'r'
}
}
fun main(){
//函数参数
val login2:(Int,Int,Int) -> Boolean = {number1,number2,number3->
true
}
}
//正常函数
fun login():Boolen{
return true
}
//隐式返回函数
//输入 输出声明,
val login:() ->Boolen = {
true //隐式返回 最后一行为隐式返回
}
fun main(){
//匿名函数
//1 方法名:参数->返回值类型 = 函数
//2 方法名 = 函数 (会自动进行类型退到)
val login3 = {number1:Int,number2:Int,number3:Int ->
number1+number2+number3
}
println(login3(1,2,3))
}
函数中定义参数是函数,这个和java中的接口回调有一定的相似。
fun main() {
val name = "xiebin"
val password = "123"
//这里定义一个匿名函数
val response = { reMsg: String, reCode: Int ->
println("返回message是$reMsg 返回的code是$reCode")
}
login(name,password,response)
}
private fun login(name: String, password: String,serviceResponse:(String,Int)->Unit): Boolean {
if (name=="xiebin"&&password=="123"){
serviceResponse("登录成功",200)
return true
}else{
serviceResponse("登录失败",400)
return false
}
}