kotlin基础笔记之类、接口、函数和基本语法

  • Post author:
  • Post category:其他


纯粹是个人学习总结,如有不对的地方请吐槽。

kotlin包概念

其实kotlin类和包没有直接的联系,包名可以和文件存放的路径不一致。

比如文件的存放地址是:com.xxx.yyy,包名可以是 package com.yyy.xxx

Imports关键字

在java中是用于导入的

在kotlin中也是导入作用的,它可以导入类,包,变量等等,导入方式和java也是一样的

如果包有冲突可以用以下方式重命名

import foo.Bar // Bar 可以使用

import bar.Bar as bBar // bBar 代表 ‘bar.Bar’

在这里as关键字的作用就是将bar.Bar变成bBar来代表

定义一个kotlin类

//普通类定义
package com.yyy.xxx
class A{
    fun a(){
      println("这是一个无参无返回值的方法")
    }
  }

//有继承关系的类
 package com.yyy.xxx
  class KotlinActivity : AppCompatActivity(){
  //实现父类的方法
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_kotlin)
    }
}
创建Kotlin类实例
val a = A()
跳转到KotlinActivity:
startActivity(Intent(this, MainActivity::class.java))

函数定义

只有一个表达式的函数定义

fun sum(a: Int, b: Int):Int = a + b  也可以 fun sum(a: Int, b: Int) = a + b
//后面的定义就是编译器可以推导出返回值类型,就可以不写返回值类型

没有返回值的函数定义

fun sum():Unit{ println("无参无返回值函数") }也可以fun sum(){ println("无参无返回值函数") }

默认参数函数定义

fun sum(b: Int, off: Int = 0, stepNum: Int = 1) {
}
调用方式:sum(10)//没有传递的参数就等于默认值,这样可以减少重载

命名参数函数定义

fun sum(str: String, isMax: Boolean = true,a: Char = ' ') {
}
调用方式:
1.默认参数调用sum(str)
2.命名参数调用sum(str,isMax=true,a='a')或者sum(str,a='a')
这种方式调用,代码可读性更强,更加灵活,没有传递的参数就是默认值
注意:命名参数语法不能够被用于调用Java函数中,因为Java的字节码不能确保方法参数命名的不变性

中缀符号

//给 Int 定义一个扩展方法
infix fun Int.shl(x: Int): Int {
}
调用方式:1 shl 2 或者 1.shl(2)
注意:只能有一个参数

函数扩展

在不继承类的情况下增加方法叫Extensions(扩展函数),我们需要在函数前加一个接收者类型作为前缀如给MutableList<Int> 添加一个 swap 函数:

fun MutableList<Int>.swap(x: Int, y: Int) {
    val tmp = this[x] // this 对应 list
    this[x] = this[y]
    this[y] = tmp
}
调用方式:
val l = mutableListOf(1, 2, 3)
l.swap(0, 2)
在swap() 函数中this持有的值是l


关于扩展的更多说明

变长参数函数定义

fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts)
        result.add(t)
    return result
}
调用方式:asList(1,2,3)或者asList(1,2,3,4,5),参数长度可随意变换

只有一个参数可以被标注为 vararg,如果vararg并不是列表中的最后一个参数,那么后面的参数需要通过命名参数语法进行传值,再或者如果这个参数是函数类型,就需要通过lambda法则.

如果参数中有一个是数组怎么传递?

val a = array(1, 2, 3)
val list = asList(-1, 0, *a, 4)
a变量在传递时一定要加前面的*号

局部函数定义

在一个函数里面包含一个函数

fun dfs(graph: Graph) {
    fun dfs(current: Vertex, visited: Set<Vertex>) {
        if (!visited.add(current)) return
        for (v in current.neighbors)
            dfs(v, visited)
    }
    dfs(graph.vertices[0], HashSet())
}

更多函数说明:

https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/FunctionsAndLambdas/Functions.html

接口定义
interface MyInterface {
    fun bar()
    fun foo() {
        //函数体是可选的
    }
}
接口实现
class Child : MyInterface {
    fun bar () {
        //函数体
    }
}
和java一样一个类可以实现一个或多个接口


更多接口说明

基本语法

变量声明
var声明可变变量 
var i = 1
i = 2
println("i:"+i)
输出结果:i:2

val声明只读变量
val j = 1
val k:Int//只声明没有赋值
j=2//编译会报错
k = 3//第一次赋值,编译通过
val就相当于java的final
if else

if else 和java的用法基本一致,kotlin没有三目运算符那怎么实现呢,就是用if else如:

var j = if(number>3) 0 else 1
when

when用法相当于java中的switch,但是比switch强大

when的判断条件可以重复,如果重复了,就按照最先原则匹配。

while do ..while 循环

他们的用法和java中完全相同

字符串
赋值var str = "abc"
拼接:str+="def"//拼接后abcdef

模板字符串
println("${str}123");//打印abcdef123
运算:
var a=1
var b = 2
println("${str}123${a+b}");//打印abcdef1233
范围表达式
创建范围需要...操作符如:var i=1..10//i中包含1,2,3,4,5,6,7,8,9,10
创建降序范围:var i = 3 downTo 1//i中包含3,2,1
步长范围创建:var i = 1..10 step 5//i中包含1,6 降序也是一样的
in操作符
判断是否在某个范围
if (x in 1..10)
print("x:${x}是在1-10之间")
判断不在某个范围
if (x !in 1..10)
print("x:${x}不在1-10之间")



版权声明:本文为android_zx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。