Kotlin 知识点总结-基础篇
一、数据类型
1.1、基本数据类型定义
val anInt: Int = 8
val aLong: Long = 12368172397127391
val aFloat: Float = 2.0F
val aDouble: Double = 3.0
val aShort: Short = 127
val maxByte: Byte = Byte.MAX_VALUE
lateinit var s:String
1.2、模板操作符
val arg1: Int = 0
val arg2: Int = 1
val charArray:CharArray= charArrayOf('a','b')
println("" + arg1 + " + " + arg2 + " = " + (arg1 + arg2))
println("$arg1 + $arg2 = ${arg1 + arg2}")
val rawString: String = """
${charArray[0]}
\t
\n
\\\\\\$$$ salary
"""
println(rawString)
Hello "Trump"
$salary
a
\t
\n
\\\\\\$$$ salary
1.3、类和对象初始化
open class MyClass (name:String, sex:String): Any() {
init {
println(this.javaClass.name+"构造方法调用name:$name sex:$sex")
}
}
class MyClass1(name:String,sex:String):MyClass(name,sex)
fun main() {
val myClass=MyClass1("zhanglei","男")
println(myClass is MyClass1)
}
1.4、空类型和智能类型转换
空类型(任意类型都有可空和不可空两种)
val notNull:String = null
val nullable:String?= null
notNull.length
nullable.length
nullable!!.length
nullable?.length
fun getName():String?{
return null
}
fun main() {
val name= getName()
if (name!=null){
println(name.length)
}
println(name?.length)
if (name==null){
return
}
println(name.length)
val name= getName() ?: return
}
类型转换
val child: Child? = parent as? Child
智能类型转换(编译器推导,远离无用的类型转换)
open class Parent()
open class Child():Parent(){
fun getString(){
}
}
fun main(args: Array<String>) {
val parent: Parent = Parent()
if (parent is Child){
parent.getString()
}
}
as 新增导包可以取别名
import com.hongshi.test2.Test2 as Test2
二、数组
2.1、定义方式
val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
val arrayOfChar: CharArray = charArrayOf('H', 'e','l','l','o','W','o','r','l','d')
val arrayOfString: Array<String> = arrayOf("我", "是", "码农")
fun main(args: Array<String>) {
println(arrayOfChar)
println(arrayOfChar.joinToString(""))
println(arrayOfChar.joinToString())
println(arrayOfInt.slice(1..3))
println(arrayOfInt.size)
arrayOfInt[1]=111
for(item in arrayOfInt){
println(item)
}
}
定制化数据与普通数据赋值对比
val helloWorldArray: Array<Char> = arrayOf('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
val helloWorldCharArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
其中基本数据类型的数组一共8个(去除包装类定制的数组)
2.2、数组处理方法
2.2.1、slice用法
val str:String="HelloWorld"
fun main() {
println(str.slice(0..1))
println(str.slice(0 until 1))
}
2.2.2、String接收字符串数组初始化
val helloWorldCharArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
fun main() {
println(String(helloWorldCharArray))
}
2.2.3、遍历
val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
for (item in arrayOfInt){
println(item)
}
arrayOfInt.forEach {
println(it)
}
forEach里面的其实是个lambda表达式,点击跳转到lambda表达式高级写法
三、程序结构
3.1、常量与变量(val,var)
运行时常量
val str
编译器常量(等价于java的final)
const val str
3.2、函数
3.2.1、基础写法
fun main(args: Array<String>) {
val arg1 = args[0].toInt()
val arg2 = args[1].toInt()
println("$arg1 + $arg2 = ${sum(arg1, arg2)}")
}
fun sum(arg1: Int, arg2: Int): Int{
return arg1 + arg2
}
main函数的入参可以这里输入,也可以通过命令行输入
kotlin com.TestKt.kt 1 2
3.2.2、简化与匿名函数
fun sum(a:Int,b:Int)=a+b
var sum=fun(a:Int,b:Int)=a+b
var print=fun(a:Int,b:Int)=printf("asdf")
3.2.3、lambda表达式
lambda是匿名函数
写法{[参数列表]->[函数体,最后一行是返回值]}
3.2.3.1、普通写法
var sum={a:Int,b:Int->a+b}
var printHello={
println("printHello")
}
var sum={
println("printHello")
1+2
}
lambda表达式带入参、返回值的完整写法
val sum = { arg1: Int, arg2: Int ->
println("$arg1 + $arg2 = ${arg1 + arg2}")
arg1 + arg2
}
fun main(args: Array<String>) {
println(sum(1, 3))
println(sum.invoke(1, 3))
}
3.2.3.2、简化
lambda表达式只要一个参数可以默认为it
val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
arrayOfInt.forEach {
println(it)
}
arrayOfInt.forEach ({ println(it) })
arrayOfInt.forEach ({ element-> println(element) })
目前JVM上支持的语言光脚本就有一百多种,Kotlin、Groovy、Scala等如果它的参数最后一个是lambda表达式,这个大括号可以移到小括号外面
Scala:想解决Java表达能力不足的问题
Groovy:想解决Java语法过于冗长的问题
Clojure:想解决Java没有函数式编程的问题
Kotlin:想解决Java
arrayOfInt.forEach (){ println(it) }
idea提示小括号没用,可以删除
arrayOfInt.forEach { println(it) }
idea提示"Convert lambda to reference"
println函数名作为参数传给forEach,同时println接收Any?任意参数
prinln源码:
@kotlin.internal.InlineOnly
public actual inline fun println(message: Any?) {
System.out.println(message)
}
forEach源码:
forEach接收参数T,而Any相当于java的Object,为任何参数的父类或者间接父类。println通过reference使用了forEach的参数T。
入参、返回值与形参一致的函数可以用函数引用的方式作为实参传入。最终写法如下
arrayOfInt.forEach(::println)
3.2.3.3、forEach退出循环
forEach接收lambda表达式,如果直接return会造成整个main方法的return
fun main() {
val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
arrayOfInt.forEach {
if (it==5){ return }
println(it)
}
println("end")
}
解决方法,加上标签ForEach@,return@ForEach
注意:ForEach名称可以随便取
fun main() {
val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
arrayOfInt.forEach asdf@{
if (it==5){ return@asdf }
println(it)
}
println("end")
}
3.2.4、函数类型
fun main() {
var printUsage=fun()= println("asdf")
println(printUsage)
var sum0=fun()=1
println(sum0)
var sum1=fun(a:Int)=a
println(sum1)
var sum2=fun(a:Int,b:Int)=a
println(sum2)
var sum3=fun(a:String,b:(String)->String)=true
println(sum3)
fun sum(arg1: Int, arg2: Int): Int{
return arg1 + arg2
}
println(::sum)
println(::sum is (Int,Int)->Int)
}
3.3、类成员
3.3.1、函数与方法的区别
In languages such as C++, functions are bits of code that will perform a particular action - but are not associated with an object. functions that are to do with an object are called methods. in java all functions are methods as they are all to do with objects.
方法位于对象上。
函数独立于对象。
对于Java,只有方法。
对于C,只有函数。
对于C++来说,这取决于你是否在一个类中
总结就是一句话:类里边的是方法,类外边的是函数
|