Kotlin 的解析(上)

栏目: IOS · 发布时间: 7年前

内容简介:1.1 kotlin是什么(1)Kotlin是由JetBrains创建的基于JVM的编程语言(2)在技术层面上,JAVA和Kotlin是同一级别的,都是以Java Byte Code形式运行在虚拟机上

1.1 kotlin是什么

(1)Kotlin是由JetBrains创建的基于JVM的编程语言

(2)在技术层面上,JAVA和Kotlin是同一级别的,都是以Java Byte Code形式运行在虚拟机上

1.2kotlin相对于 Java 有什么优势

(1)更容易学习:Kotlin是一门包含很多函数式编程思想的面向对象的编程语言

(2)轻量级:相比于其他的语言,Kotlin函数库更小,由于Android存在65K方法数限制,使得这一点比较重要

(3)高度互操作性:Kotlin可以和其他Java库友好且简单的进行互相操作

(4)非常友好的集成Android Studio 以Gradle,Kotlin又一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件。推出的AS3.0+已经集成了Kotlin

(5)Kotlin还有很多语法层面的特性,如数据模型、空指针安全、扩展函数等

1.3 kotlin能做什么

(1)服务端开发

(2)以JavaScrip方式运行

(3)开发Android App

2.Kotlin基础知识

2.1基础语法2.1.1 定义变量: 绝大数编程语言都有常量和变量,Kotlin和同源的Java类似,尽管没有常量语法,但可以使用final关键字定一个不可以修改的变量

Java代码

int n=30;
int ok;
final int m =20;
ok =123;
m=10;
复制代码

Kotlin代码

var n :Int =30
var ok:Int 
val m :Int =20 
m=10 //编译出错,因为m是常量
复制代码

不同点

(1)位置不同 (2)变量和常量需要关键字:在Kotlin中,定义变量需要var,定义常量需要val开头 (3)数据类型首字母:在kotlin中,数据类型都以大写字母开头 (4)如果在定义变量时未进行初始化,就必须要制定数据类型,如果在定义变量时进行了初始化,可以不指定数据的类型,Kotlin编译器会自动根据等号右侧的值推倒数据的类型 2.1.2 定义函数 函数定义如下几个部分: (1)函数头,包括函数名和识别函数的关键字,如fun、function等 (2)参数,包括参数名和参数类型 (3)返回值

Kotlin 代码

fun add (m: Int ,n:Int):int
{
return m+n
}

fun process(m: Int):Unit //也可以省略
{
println(m*m)
}
复制代码

2.1 .3 注解 (1)但行注解 // (2块注解/ / (3)嵌套注解/*/ /*/ 新增的Java中是不支持的

2.2 基础数据类型2.2.1 数值类型

数据类型 占用字节数
Double 8
Float 4
Long 8
Int 4
Short 2
Byte 1

Kotlin代码

var m =29
val n :Byte=10
m=n  //编译错误,无法将Byte隐式转换为Int

var x:Long =20 //可以将Int类型的值隐式转为Long
val value:Short=20
m=value //编译错误,无法将short隐失转换为Int
复制代码

如果我非要转换呢?莫急Kotlin提供了一系列的方法使用来进行类型之间的转换:

toByte()   toShort() ... toChar()
复制代码

Kotlin与Java一样提供了一些特殊的表示方法,表示Long、Float以及十六进制和二进制(八进制目前还不支持) (1)表示Long/Float类型的值,在数字后面加上L/F或者l/f (2)表示十六进制,在数之前加0x (3)表示二进制,数值前面加0b (4)如果数值很大,还可以123_3454_567这样表示 2.2.2 字符类型 在Kotlin语言中,字符类型用Char描述,不过和JAVA不同的是,在Kotlin中,字符不能直接看作数字

Java代码

void check(char c){
if(c == 97){//可以编译通过
}
复制代码

Kotlin代码

fun check(c: Char){
if(c == 97){//会产生编译错误
}
}
复制代码

2.2.3 布尔值 Kotlin语言中的布尔类型用Boolean描述,该类型有两个值:true 和false

2.2.4 数组

//使用arrayOf 函数定义可以存储人意的数组
val arr1 = arrayOf(1,2,3,'a')
print(arr1[1])
arr1[2]='b'

//使用arrayOfNulls 函数定义数组
var arr2 = arrayOfNulls<Int>(10)

val arr3 = Array(10,{i ->(i*i).toString()}
println(arr3[3])
复制代码

2.2.5 字符窜

//第一类字符串(与Java类似)
var s1 = "hello \nword"
println(s1)

//第2类字符窜,保留原始格式
var s3=""" hello
                           word
            hehhe!
"""
复制代码

字符串模版

val i=10
val s1 = "I = $I"
println(s1) 

val s2 = "abd"
val str = "$s2 的长度是 ${s2.length}"
println(str)
复制代码

2.3 控制流2.3.1 条件语句 Kotlin 代码(传统的if用法)

var a = 20
var b =30
var max :Int
var min: Int
if(a>b){
max = b
}

if(a>b){
min=a
}
else{
min=b
}

复制代码

Kotlin 代码(将if语句作为表达式使用)

var a=20
var b=30
val max =if(a>b)a else b
println(max)

//if.   else 后面是一个代码块,最后一个表达式将作为返回值
val min  = if(a>b){
println(a)
a
}
else{
println(b)
b
}
复制代码

2.3.2 when 语句(代替了java的switch语句,功能简直是逆天) (1)标准的when的用法

var x=1
when(x){
1 -> {
println("x == 1")
}
2->{
println("x==2")
}
else ->{
println("输出:x")
}
}
复制代码

(2)when作为表达式使用

var x =1
var m = when(x){
1 ,3,4-> { //如果多个分支执行的结果一样,可以在一个分支用(,)分隔多个条件
println("x ==1")
10}
2 -> {
println("x==2")
20
} else ->{
println("x")
40
}
}

println(m)
复制代码

(3)使用in关键字

var n = 25
when(n){
in 1..10 -> println("输初")
!in 30 .. 60 -> print("非30-60范围")
else -> println("条件未知")
复制代码

(4)分支条件还可以式函数

fun getValue(x:Int):Int{
return x
}

var n =4
when(n){
getValue(2)->println("2")
getValue(4)->println(4)
else -> println("没有满足条件!")
复制代码

2.3.3 for 循环 枚举数组中所有的元素

var arr = intArrayof(2,4,5,7,8)
for(item : Int in arr){
println(item)
}

for (i in arr.indices){
println("arr[$i] = " +arr[i])
}
复制代码

2.3.4 while 循环 和Java里面式一样的,就不多说了,自己可以看一下,没啥变化的

3. 类和接口

与Java一样,在Kotlin中,类的声明也使用class,如果只是声明一个空的类的话,Kotlin和Java没有任何的区别,不过要是定义其他的成员,差别还是很大 3.1 构造器 3.1.1 主构造器   在Kotlin中,类允许定义一个主的构造器(primary constructor)和若干个第二构造器(secondary constructor),主构造器是类头的一部分,紧跟在类名的后面,构造器参数是可选的 kotlin 代码

class Persion constructor(firstName:String){
}
//如果主构造器没有任何的注解或者修饰器,constructor关键字可以省略

class Persion(firstName:String){
}
复制代码

  目前大家可能有疑惑,代码重只看的见定义主构造器,那么应该在哪里实现主构造器呢?其实,如果是主构造器的话,需要在init块中进行初始化

class Persion (firstName:String){
var name = firstName
init{
println(firstName);
}
}
//要注意的,主构造器的参数不仅可以用于在init块中,还可以用于对类属性的初始化
复制代码

3.1.2 第二构造器   (1)Kotlin类除了可以声明一个主构造器,还可以声明若干个第二构造器,第二构造器需要在类中声明,前面必须加上constructor关键字 Kotlin 代码

class Persion {
constructor(parent:Persion){
println(parent)
}
}
复制代码

  (2)如若类中声明了主构造器,那么所有的第二构造器都需要在声明后面调用主构造器,或者通过另外一个第二构造器间接的调用第二构造器 Kotlin 代码

class Demo(var url : String){
//主构造器实现部分
init{
println("主构造器,嘻嘻!无知的人类")
}
//第二构造器(通过this直接调用了主构造器)
constructor(value:Int):this("https://linghit666.doubi.com")
{
println(value)
}
//通过this直接调用了主函数
constructor(des:String,url:String):this("{"+url+"}")
{
println(des+";;;;"+url)
}
//通过第二构造器间接的调用主构造器
constructor():this(20)
{
println("https://www.doubi.com")
}
}
复制代码

注意:在主构造器参数重可以使用var和val,但第二构造器中不能使用var和val,意思就是第二构造器的参数都是直读的,不能在构造器的内部改变参数值 3.1.3 Kotlin 中的Singleton模式 Kotlin 代码(Singleton 模式)

class Singleton private constructor() {
   private object mHolder {
       var INSTANCE = Singleton()
   }

   companion object {
       fun getInstance(): Singleton {
           return mHolder.INSTANCE
       }
   }
}
//是不是感觉大吃一惊,相对于Java的单例模式,是不是很懵逼,之所以Kotlin方式不同,主要因为Kotlin类不支持静态方法和成员,由于kotlin支持全局函数和变量,因此可以直接使用全局函数和变量来代替静态方法和静态成员变量
复制代码

3.1.4 Kotlin 函数中默认参数   现在的很多语言都支持默认参数,例如js、dart、 go 等,但是遗憾的是Java并不支持,是不是很气,但是值得庆幸的是Kotlin却是支持默认参数

class Persion(val name:String="Bill",var value :Float = 20.4f,sex :Int) {
  //其实这个是Kotlin的一个语法糖,想知道原理的可以反编一下,查看一下字节码,应该就会懂了
}
复制代码

3.2 类成员  Kotlin 中属性的语法

var/val [:][=<property_initalizer>] [] []

3.2.1 属性的getter和setter 形式   由于Kotlin从语法上支持属性,因此并不需要为每一个属性单独定义getter和setter方法 Kotlin 代码

class Persion {

   private var name: String = "sdfsfd"
   fun getName(): String {
       return name
   }

   var value: Int = 0
       get() = field
       set(value) {
           field = value
           Log.i("tag","数值: " +";;;;" +value)
       }

}
复制代码

3.3 类的继承3.3.1 修饰符

private :仅仅在类的内部可以访问
protected:类似上面的,但是可以在子类中也可以访问
internal:任何在模块内部的类都可以访问
public:任何的类都可以访问
复制代码

示例:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4 //默认的是public

    protected class Nested {
        public val e: Int = 5
    }
}

class SubClass : Outer() {
    //a不能访问,b、c、d、Nested().e都可以访问
    override val b: Int = 10 //重写父类的常量b
    init {
        b
        c
        d
       Nested().e
    }

}
复制代码

3.3.2 类的继承   与Java不同,Kotlin类的继承需要使用(:)冒号,而JAVA你懂得,注意,冒号后面需要调用父类的构造器,与JAVA一样,都是单继承,Kotlin默认时class是final的,也就是说,默认的时候不允许继承,需要显示的使用open

open class Parent {//使用open声明,才能允许其他类继承
open val name :String ="know"
    protected var sex =1;
    open protected fun  getYcSex():Int{
        return sex
    }

}

class Child :Parent(){
override var name:String ="wukong"
    override fun getYcSex(): Int {
        return super.getYcSex()
    }
}
//如果在子类中重写方法,就需要在父类相应的方法前面加open,而且要在子类的方法前面加override
//如果想阻止子类的方法被重写,就要在override前面加final
//属性重写与方法类似,被重写的属性前面需使用open声明,子类的属性前加override,注意的是,val属性可以被重写成var的,反之不行
复制代码

3.4 接口  Kotlin中的接口与Java类似,使用interface关键字声明,一个类可以实现多个接口,而且接口中的属性以及方法都是open的

3.4.1接口的示例

interface Extend{
    fun  process()
    fun getYcName():String{
    //允许接口包含默认的方法体,有方法体的,不要求一定重写
        return "nihao"
    }
}


class Child :Parent(),Extend{
    override fun process() {

    }

    override fun getYcName(): String {
      // 可以不重写
        return super.getYcName()
    }

    override fun getYcSex(): Int {
        return super.getYcSex()
    }
}
复制代码

3.4.2抽象类 抽象方法不需要使用open声明,因为抽象方法类本身都可以继承

abstract class ChouXiang :Extend{
    abstract fun hellow()
}

class Persion :ChouXiang() {
    override fun hellow() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun process() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}
复制代码

总结

截止目前的话Kotlin中大概的基础知识,差不多都示例讲解了一下,基本的一些东西都可以看懂知道了,希望对你想了解kotlin有些帮助


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Letting Go of the Words

Letting Go of the Words

Janice (Ginny) Redish / Morgan Kaufmann / 2007-06-11 / USD 49.95

"Redish has done her homework and created a thorough overview of the issues in writing for the Web. Ironically, I must recommend that you read her every word so that you can find out why your customer......一起来看看 《Letting Go of the Words》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具