Bootstrap

kotlin

参考资料:
参考资料

1、kotlin编译原理是先编译为class文件,再在java 虚拟机上执行

2、变量
var = 1 变量
val = 2 常量
kotlin存在类型推导机制
var c:Int = 1

kotlin不存在基本类型,将全部使用对象类型

3、函数
fun test(){}

fun add(a:Int,b Int):Int{
	return a+b;
}
由于存在类型推导,所以:
fun add(a:Int,b:Int) = a+b

函数的调用
fun main(){
	test()
	println(add(1,2))
}

4、选择语句
if when:
	fun max(int:a,int b):Int{
		if(a>b) return a
		else return b
	}
	

	kotlin的if可以包含返回值, if语句的最后一行会作为返回值返回
	fun max(a:Int,b Int):Int{
		return if(a>b) a else b;
	}

	kotlin的if必须有else,否则会报错
	fun getScore(name:String) = if(name=="Tom") "不及格"
	else if(name == "Jim") "良好"
	else if(name == "Fiona") "优秀"
	else "名字非法"

	Kotlin中的== 是Java中的equal,比较的是 内容
	Kotlin中的===是Java中的==,比较的是引用

	when的实现也必须要有else,否则会报错
	fun getScore(name:String):String = when(name){
		"Tom"->"不及格"
		"Jim"->"及格"
		"Fiona"->"优秀"
		else->"名字非法"
	}

	when支持参数检查
	fun checkNumber(num:Number){
		when(nun){
			is Int->println("Int")
			is Double->println("double")
			else println("others")
		}
	}
	when 可以不传递参数
	fun getScore(name:String) = when{
		name == "Tom" ->"不及格"
		name == "Jim" ->"及格"
		name == "Tony"->"良好"
		name == "Fiona"->"优秀"
		else ->"名字非法"
	}

	fun getSore(name:String) = when{
		//若name以Tom开头则命中此分支
		
	}

5、循环语句
when和Java差不多      for-in是对Java for-each的加强
val range = 0..10
双闭区间
fun main(){
	var range = 0..10
	for(i in range){
		println(i)
	}
}

左闭右开
fun main(){
	var range = 0..10
	for(i in 0 until 10){
		println(i)
	}
}

跳步
fun main(){
	var range = 0..10
	for(i in 0 until 10 step 2){
		println(i)
	}
}

降序
fun main(){
	var range = 0..10
	for(i in 10 downTo 1){
		println(i)
	}
}

6、类和对象的初始化
class Person{
	var name = ""
	var age = 0
	fun printInfo(){
		println(name+"'s age is "+name)
	}
}

使用person类
fun main(){
	Person p1 = Person()
	p1.name = "Finoa"
	p1.age = 12
	p1.printInfo()
}

继承
class Student : Person{
	var grade = ""
	var name = ""
	var age = 0
	fun study(score:Int):Int{
		println("score is "+score)
		return score
	}
}

final修饰的类不可以被继承、需要使用open关键字修饰
open class Person{
	...
}

构造 
主构造
class Student(var name:String,var age:Int) :Person{

}
open class Person(var name:String,var age:Int){

}
继承有参构造的类
class Student(var name:String,var age:Int,var score:String):Person(name,age){
...
}

次构造
无参构造,字符串默认为"",Int默认为0
class Student(name:String,age:Int,score:String,grade:Int):Person(name,age){
	constructor(name:String,age:Int,score:String):this(name,age,score,0)
	constructor():this("",0,"",0){

	}
}
fun main(){
	Student s1 = Student("Jimmy",10,"88",1)
	Student s2 = Student("Fiona",18,"98")
	Student s3 = Student()
}

无主构造
如类不使用主构造,则后续继承类也不需要使用构造即可去掉继承类的(),次构造可以调用父类构造super进行初始化,但是次构造的参数在其他地方无法引用
class Student:Person{
	constructor(name:String,age:Int,number:String):super(name,age){
		
	}
	fun study(){
		println(name,age)
		println(number)报错,若number是主构造的参数则可引用
	}
}

7、接口
interface Study{
	fun study()
	fun readBooks()
	fun doHomework()
}
继承接口只需使用,进行拼接,并需要实现接口的所有函数
class Student(name:String,age:Int,grade:string):Person(name,age),study{
	override fun study()
}
kotlin支持接口方法的默认实现,则继承类无需必现实现此方法

8、数据类和单例类
数据类只处理和数据相关的,如getset、hashCode、equals、toString

9、Lambda
集合的创建和遍历
list:
fun main(){
	val list = ArrayList<Int>()
	list.add(1)
	list.add(2)
	list.add(3)

	val list1 = listOf<Int>(1,2,3,4,5)
	list1.add(6)//listOf不可变,只可查
}

map:
fun main(){
	可变
	val map = HashMap<String,String>()
	map.put("1","Jimmy")
	map["2"] = Tommy
	println(map.get("1"))
	println(map["2"])
	不可变
	val map1 = mapOf<String,String>("3" to "Fiona","4" to "whilt")
	可变
	val map2 = mutableMapOf<String,String>("5" to "Kevin",6 to "Dabby")

	遍历
	for((key,value) in map){
		println("key is  "+key +" value is "+value)
	}
}

lambda可以传递代码
参数名1:参数类型,参数名2:参数类型->函数体
fun main(){
	val list = listOf<String>("a","aba","aabb","a")
	var maxStr = ""
	for(str in list){
		if(str.length>maxStr.length) maxStr=str
	}
	println("max is "+maxStr)
}


kotlin把空指针异常检查提前到了编译期,若空指针则会报错
java的做法
public void Student(Study study){
	if(study==null){
		return;
	}
	study.doHomework()
	study.doExtrawork()
}
kotlin的做法
fun Student(study:Study){
	study.doHomework()
	study.doExtraWork()
}

fun main(){
	Student s1 = Student(null)//kotlin这么写会报错
	Student s2 = Student(Study())//ok
}

?的意思是当前参数可为空,如果可为空的话,则此对象调用的方法必须要保证不为空,说白了如果使用?就表示参数对象可为空,因此就不要调参数对象的方法了,毕竟这个对象都可能为空




;