- 主函数:
fun main(args:Array<String>){
println("hello")
}
- 声明变量
1. var name="gongxm"; 变量的类型在存储数据时由编译器自动判断
2. var name:String="gongxm"; 声明变量时手动指定数据类型
3. val name="gongxm"; 声明常量,常量只读, 不能修改
- 函数的定义
fun 函数名(参数名:参数类型):返回值类型{
方法体
}
例如:
fun add(a:Int,b:Int):Int{
return a+b;
}
注意: 如果没有返回值, 返回值类型可以写 Unit 也可以省略不写!
- 模板数据
var temp = " xxxxxxxxxxx ${name} xxxxxxxxxxxxxxx "
其中${name}就是动态变化的数据
- 字符串比较
var stra = "aaa";
var strb = "bbb";
stra.equals(strb) 判断两个字符串是否相同,区分大小写
stra==strb 同上, 效果一样
stra.equals(strb,false) 判断两个字符串是否相同,不区分大小写
- 空值处理
fun print(str:String){ // 该方法不允许传入null
....
}
fun print(str:String?){ // 该方法可以传入null
....
}
- when表达式
var result = when(num){
1 ->"一"
2 ->"二"
3 ->"三"
else ->"other"
}
- for循环
var nums = 1..100
var sum = 0
for(num in nums){ //循环执行100次
sum+=num
}
for(num in nums step 2){//间隔2执行
...
}
var renums = nums.reversed() //反转nums中的内容
var count = nums.count(); //获取nums的个数
- list的使用
var list = listOf("a","b","c")
for((i,e) in list.withIndex()){
println("$i $e")
}
- Map集合
var map = TreeMap<String,String>()
map["good"] = "好"
map["study"] = "学习"
println(map["good"])
- 函数的特殊写法一:
var add = {x:Int,y:Int->x+y}
var sum = add(10,20)
println(sum)
- 函数的特殊写法二:
var add:(Int,Int)->Int = {x,y->x+y}
var sum = add(10,20)
println(sum)
- 默认参数:在声明方法时,可以直接指定该参数的一个默认值
例如,求圆的面积:
fun getArea(PI:Double=3.1415,radius:Double):Double{
return PI*radius*radius;
}
- 具名参数:
在调用以上声明的方法时,可以像正常的方法一样调用,传入两个参数
也可以只传入一个参数,因为第一个参数是有默认值的,调用方式:
var area = getArea(radius=2.0)
println(area)
必须要指定传入的参数是哪个!
- 数字和字符串的互转
var a = 10;
var b = "20"
var c = a.toString() //数字转字符串
var d = b.toInt() //字符串转数字
- 键盘录入
var str = readLine()
- 异常的处理
try{
可能会发生异常的代码
}catch(e : Exception){
异常处理代码
}
- 尾递归优化:强制让递归执行完毕,避免内存溢出
tailrec fun add(num:Long,result:Long):Int{
println("正在执行第${num}次...")
if(num==0L){
println("最后一次执行了,结果是"+result)
return 1;
}else{
return add(num-1,result+num)
}
}
限制:返回的结果必须是函数本身!不能有其他内容
- 类的定义:
1.只有属性的类
class Girl(var name:String,var age:Int)
2.有方法的类
class Girl(var name:String,var age:Int){
fun smail(){
println("${name}好开心呀")
}
}
- 对象的创建
var gf = Girl("林妹妹",23)
- 继承
open class Father{
var money = 100
open fun speek(){
println("会说中国话!")
println("财富值是:${money}")
}
}
class Son:Father(){
override fun speek(){
super.speek()
println("会说英语!")
}
}
注意:
1.一个类想被别的类继承, 需要声明为open的
2.一个类中的方法想要给子类重写, 需要声明为open的
3.子类要重写父类中的方法时,需要声明为override的
- 抽象类
abstract class Person(var name:String){
fun speek(){
println("${name}会说中文!")
}
abstract fun eat()
}
class Student(name:String):Person(name){
override fun eat(){
println("${name}吃大餐了!")
}
}
注意:
子类在声明跟父类中相同的属性时,不需要写var了!
- 接口
interface USB{
fun open()
fun close()
}
class Mouse:USB{
override fun open(){
println("打开鼠标")
}
override fun close(){
println("关闭鼠标")
}
}
- 委托和代理
interface 卖车{
fun 砍价()
}
class 中间商:卖车{
override fun 砍价(){
println("卖了10万块")
}
}
class 个人:卖车 by 中间商(){
}
理解:
一个在实现接口时, 可以直接委托给另一个已经实现了该接口的类, 然后就可以直接使用另一个类中已经实现的方法了
- 单例模式
object GirlFriend{
fun eat(){
println("大吃一顿!")
}
}
- 单例的对象调用:
GirlFriend.eat()
- 枚举的定义
enum class Direction{
UP,DOWN,LEFT,RIGHT
}
- 印章类: 控制子类的个数
sealed class Animal{
fun eat(){
println("吃饭!")
}
class Dog:Animal(){
fun lookHome(){
println("看家")
}
}
class Cat:Animal(){
fun catchMouse(){
println("抓老鼠")
}
}
}
类似于枚举,也类似于抽象类.
- is关键字
相当于java中的instanceof关键字
而且,判断后会智能转换成该类型,可以直接使用!
var d:Animal = Animal.Dog()
d.eat()
if(d is Animal.Dog){
d.lookHome() //Dog类中的特有方法
}
- 函数式编程
//把一个函数赋值给一个变量
var print = fun(str:String){
println(str)
}
var list = listOf<String>("tom","josen","kotlin")
list.forEach(print) //把函数变量作为参数传递给forEach方法
println("---------")
list.forEach{
str->println(str) //直接在forEach方法中写一个方法的内容
}
println("---------")
list.forEach{
println(it) //直接在forEach方法中写一个方法的内容, forEach方法中会默认给遍历到的元素自动命名为: it
}
- list集合中的高级函数
maxBy{条件}: 根据条件获取集合中符合条件的最大值
minBy{条件}: 根据条件获取集合中符合条件的最小值
filter{条件}: 根据条件获取集合中所有符合条件的结果, 返回的是一个集合
map{ it.name }: 把集合中的元素的name作为元素, 存储到一个新的集合中,返回新list集合
any{条件}: 判断集合中是否有符合条件的元素, 返回true或者false
count{条件}: 获取集合中符合条件的元素个数
find{条件}: 返回集合中第一个符合条件的元素
groupBy{ it.age } : 集合中的元素根据指定的内容分组, 返回一个Map集合
- 函数增强: 自定义DSL
var mylist = listOf<String>("a","b","c","d")
fun List<String>.getSize():Int{ //List本身是没有getSize方法的,
//可以通过后缀的方式, 给List增加一个getSize方法
return size //在这里面, 可以直接调用List中原有的内容
}
遍历打印集合的新方式
mylist.forEach(::println)
中缀表达式
infix fun List<String>.has(value:String):Boolean{
forEach { if(it==value) return true }
return false
}
正常的调用:
println(mylist.has("a"))
使用了中缀表达式, 可以这样调用: 无需使用点和小括号
println(mylist has "a")
注意:
1.中缀表达式只能用在自定义DSL中, 一般函数无法使用
2.函数必须有且只有一个参数
网友评论