变量
var和val两种,val不能重新赋值
基本数据类型
Int Long Short Float Double Boolean Char Byte
函数:
fun methodname(param1:Int,Param2:Int):Int{ return 0}
函数2
fun methodname(param1:Int,Param2:Int)=max(1,2)
if语句
同java,有一个额外功能:可返回值
var value = if(num1>num2) num1 else num2
when语句
fun getScore(name:String)=when(name){
"Tom" -> 86
"Jim" -> 77
else -> 0
}
类似于switch,但不需要写break
格式为:匹配值->{执行逻辑},执行逻辑只有一行代码时可省略{}
功能1:可做类型匹配
fun checkNumber(num:Number){
when (num){
is Int ->println("number is Int")
}
}
功能2: 不带参数的用法
fun getScore(name:String) = when{
name.startswith("Tom") ->86
name =="jim" ->77
}
while循环
与C++ java无差别
for 循环
闭区间【0,10】
for( i in 0..10){
println(i)
}
左闭右开
for (i in 0 until 10 step2)
{
println(i)
}
类与对象
任何一个类都默认是不可被继承的,要在前声明open才可被继承
open class Person(val name:String, val age:Int) //主构造函数
{
}
Student 类继承Person类,Student的主构造函数调用person类的构造函数
class Student(val sno: String, val grade:Int , name:String, age:Int):Person(name,age) {
init{
println("sno is"+sno)
println("grade is"+grade)
}
constructor(name:String,age:Int):this("",0,name,age){}
constructor():this("",0){}
}
}
主构造函数没有函数体,用init结构体写逻辑
主构造函数中的参数,若父类的构造函数中也有.则不用声明是val or var
次构造函数通过constructor()关键字定义
当类没有主构造函数时,继承父类时不用调用父类的构造函数(即不用加括号),次构造函数直接调用父类的构造函数
class Student:Person{
constructor(name:Sting,age:Int):super(name,age){
}
}
接口 interface
interface Study {
fun readBooks()
fun doHomework()
}
class Student(name: String, age:Int):Person(name,age),Study{
override fun readBooks() {
println(name + "is reading.")
}
override fun doHomework() {
println(name+"is doing homework.")
}
}
kotlin使用override关键字来重写父类或者实现接口中的函数
Student类实现了Study接口,则Student类的实例对象可以把他的Study作为函数的参数
允许对接口中定义的函数进行默认实现
函数可见性修饰符:public,private,protected,default,internal
数据类 data class
data class Cellphone(val brand:String,val price:Double){
}
fun main(){
val cellphone = Cellphone("aaa",12999.0)
val cellphone2 = Cellphone("aaa",12999.0)
println(cellphone == cellphone2)
}
数据类用于将服务端或者数据库中的数据映射到内存中,为编程逻辑提供数据模型的支持。一行代码会自动生成equals() hashcode() toString()
单例类 object
单例模式是最基础的设计模式之一,可用于避免创建重复的对象,我们希望全局某个类最多只能有一个实例时,可用单例模式。
object Singleton {
fun singletonTest(){
println("Test")
}
}
lambda编程
集合的创建与遍历
不可变的集合 listOf
fun main(){
var list = listOf("App","ssss")
for (fruit in list){
println(fruit)
}
}
可变的集合 mutableListOf
fun main(){
var list = mutableListOf("App","ssss")
list.add("ssssdf")
for (fruit in list){
println(fruit)
}
}
set集合的用法和list集合用法一样,setof和mutableSetof,但是Set集合底层用hash映射机制来存放数据,无法保证有序。
map键值对
fun main(){
val map = mapOf("apple" to 1,"Bannana" to 2)
for((fruit,number) in map){
println(fruit+number)
}
}
集合的函数式API
LAMbda就是一小段可以作为参数传递的代码
list.maxBy(it.length} 最大长度的对象
list.map{it.toUpperCase()} 全部转换为大写
list.filter{it.length <=5} 只保留<=5
list.any{ it.length <=5} 集合中是否有满足条件
llst.all{ it.length <=5} 集合中是否所有都满足
Java函数式API的使用
如果单抽象接口是用java定义的,若有函数把这个接口作为参数,则可以调用函数API
例如 onclickListener是 java定义的的单抽象接口,若要注册一个按钮点击事件,则java要把这个接口的匿名类实例作为参数传入一个函数 setonclickListener(),并且还要通过override关键字来重写接口中的函数,但kotlin只用调用一个函数时API setonclickListener(),不用传参,不用重写函数。
public interface OnclickListener{
void onClick(View v);
}
java:
button.setONclickListener(new View.ClickListener(){
@Override
public void onClick(View v){
}
});
kotlin:
button.setOnclickListener{
}