Kotlin基础学习笔记 (二)

1、定义
Kotlin是一门可以运行在java虚拟机、Android、浏览器上的静态语言与Java 100%兼容。
 
2、数据类型
 
 2.1、Numbers 基本数据类型
     Boolean数据类型
val aBoolean: Boolean = true; // val 变量名:变量类型= 赋值
 
Number数据类型
Type       
Bitwidth
Long
64
Int
32
Short
16
Byte
8
Double
64
Float
32  
 
 val aFloat :Float =2.0F(不加F是双精度浮点型)
 val minFloat :Float = -Float.Max_VALUE
 0.0F/0.0F != Float.NaN 不是数
 
Integer :装箱类型
int : 基本类型
Kotlin:Int = 基本类型+装箱类型 :合体
 
2.2、字面量
    十进制:1
    Longs 类型大写L :1L
    十六进制:0x01
    二进制:0b0000 0001
    八进制:无| 不支持八进制
 
2.3、字符串:
字符串String 不可变类型
字符char类型,一个char类型占2个字节,表示一个16位字符
 
转意符:由转义字符、原声字符串、换行和任意文本
\t : 制表符
\b: 光标后退一个字符
\n: 回车换行符
\r: 光标回到行首
\' : 单引号
\": 双引号
\\ : 反斜杠
\$ : 美元符号
 
Characters
    Characters 用 Char表示;用单引号表示Chararacter;可以调用显示转换把Character转换为Int
Char 类似 于Java的基本类型 char ,Char?类似于Java引用类型Character。
 
字符串模版表达式——以$符号开始 ,内部是一个任意表达式
 两个整型相加母版:
println("$anInt+$anotherInt= ${anInt + anotherInt}")
 
美元符号
val salary : Int = 1000
print(“$$salary”) ===》$1000
 
原生字符串:
使用 引号三个(””") 引起来的String,内部没有转义,通过 “空格”分开进行转意
 
字符串比较:
a=b :赋值;在逻辑运算时有效
a ==b :等于运算;标示比较内容或是值,而不是引用;即类似于java的equals
a ===b ,完全等于运算;表示比较对象是否相同,是否为同一个,比较对象的引用值(同时也比较值)
 
基本类型的转换——kotlin不支持隐式转换
-val anInt : Int =5 
-val aLong : Long =anInt.toLong();  //显示转换
 
Numbers类型支持如下的转换:
toByte() :Byte
toShot() :Short
toInt() :Int
toLong() :Long
toFloat() :Float
toDouble() :Double
toChar() :Char
 
 
    2.4、类和对象
类:一个抽象的概念,具有某些特征的事物的概括,不特定指代任何一个具体的食物
class <类名> ( 构造方法) {<成员>... }
         类和对象的关系
  •     一个类通常可以有很多具体的对象
  •     一个对象本质上只能从属于一个类
    Class (1)—————对应关系——————object(1…n)
 
     2.5  类的继承
  •     提取多个类的共性得到一个更抽象的类,即是父类
  •     子类拥有父类的一切特征
  •     子类也可以自定义自己的特征
  •     所有的类都最终继承自Any,所有类的始祖
 
    ex,一个简单的对象及其构造方法:
            
class 妹子(var 性感: String,
        var 长发: String,
        var 甜美: String){
    //若无具体实现可以删掉{ }
    init {
        println("new 了一个妹子, 性格:$性感,长发:$长发,甜美:$甜美")
    }
}
val 我喜欢的妹子: 妹子 = 妹子("咪咪","黑色","声音")
 
 
 2.4.空类型和智能类型转换
 
空类型安全
java:在java中null会报空指针异常
kotlin:在kotlin中任意类型都有可空和不可空两种
 
不可空类型 就类似与java中的基本数字类型,是原始的数字类型,比如,int,long,float,double等
可空类型 就相当于引用的数字类型,如integer,Long,Float,Double
 
ex 1:
判断name 是否为null的状态
old 示例写法: 
val name = xxx();
    if( name == null ){
        println(“xxxx”);
    }else{ 
        printlin(name.length)
    }
 
new 示例写法:
val name = xxx():
//如果name不为空就返回长度,否则返回null
println(name? .length)  
 
ex 2:
判断name 是否为null的状态,若为null则直接返回
 
old 示例写法:
    val name = xxx();
    if(name == null ) return 
 
new 示例写法:
//定义一个名为name的变量,它的值是xxx();如果xxx()返回的是null,就进行return——>”?:"
    val name:String = xxx()?:return 
 
“?: always 表达式”:判断问号之前的表达式;如果为空,则执行?后面的语句
    
注意:将getName()的值返回并赋值给name,这个name的类型是一个不可为null的String类型
val name : String = getName() ?: return 
println(name.length) //否则返回一个string类型的变量
 
ex 3:
对于一个可null的String类型,但值却不是null
 
    val value :String? = “FuckWorld”
       if( value is String )
       //在已经肯定String 字符串不为null的情况下,可以使用 “!!.” 进行表达式肯定的阐述
        println(value!!.length)// !!.强制认可空类型 nullable
 
类型转换异常
   val parent: Parent = parent()
    val child:Child ?= parent as? Child//如果转换失败则抛出异常(安全的类型转换)
       println( child ) //返回为null 
 
// 这里不能通过编译. User对象不能是null
 var notNullUser: User= null
 
 // User可以是 null 
var user: User? = null 
 
// 无法编译, user可能是null,我们需要进行处理
 user.print() 
 
// 只要在user != null时才会打印
 user?.print() 
 
// 使用Elvis操作符来给定一个在是null的情况下的替代值 
val name = user?.name ?: "empty” 
 
/** 如果user为可空类型,又一定要调用它的成员函数和变量,
*可以用 !! 操作符 两种可能,
*要么正确返回name,要么抛出空指针异常 当user为null,
*你不想返回null,而是抛出一个空指针异常,你就可以使用它。 
**/
var name = user!!.name
 
 
任意类型都有可空和不可空两种:
-val notNull:String = null    //错误,不能为空
-val nullable: String?= null  //正确 ,可以为空 String可null类型
-notNull.length    //正确 ,不为空的值可以直接使用
-nullable.length    //错误, 可能为空,不能直接获取长度
-nullable !!.length  //正确,强制认定nullable不可空
-nullable ?.length  //正确 ,若nullable为空,返回空
 
智能类型转换
java style 类型转换
-val  sub : SubClass = parent asSubClass 
——类似于java的类型转换,失败则抛出异常
 
安全类型转换
-val  sub:SubClass ?= parent as?SubClass
——如果转换失败,返回null 不抛异常
 
智能类型转换
-if(parent is SubClass)parent.<子类的成员>
    ——编译器尽可能的推导类型,远离无用的类型转换
-if(nullable != null) nullable.length
    ——正确!因为确认nullable不可空
 
2.5  包Package
 命名空间,限定一个类的使用范围,路径
 
2.6  区间Range
 
var ranger:IntRange=0..1024//闭区间 [0,1024] ,整形区间
    .. :rangeTo
var ranger_exclusive:IntRange=0 until  1024//半开区间 [0,1023] or [0,1024)
        until : CloseRange {
            CharRange / 
            ComparableRange /
             IntRange 
            / LongRange  }
 
var   emptyRange: IntRange = 0..-1 //表示为空区间 
    i in 0..100 判断 i 是否再区间 [0,100]中 
        range.contains(50)  === 50 in range 
迭代: 
    for ( i in ranger_exclusive ) { 
                print (“ $i , “) 
    }
 
2.7 数组 
数组数组 ,数是数,组是组,合在一起就是组,就没有数了。
数组就是一系列的对象
 
基本写法:通过arrayOf 创建数组
    (1)包含数值的数组:val a:Array<String> = arrayOf(“yy”,”xx")
    (2)指定大小,元素位空的数组:val b: arrayOfNulls<String>(10)
    (3)函数数组: val c = Array(10, {i->(i+1).toString() } )
       (4)  kotlin 自带原始类型 数组: xxArrayOf (... )
val arrayOfInt:IntArray = intArrayOf(1 ,3 ,5 ,7)
val arrayOfChar:CharArray = charArrayOf(“i”,”a”,”m")
val arrayOfString:Array<String>=arrayOf( “me”,”is” ,”god"); //字符串数组
 
 
基本操作
    1、数组的大小
    arrayOfInt.size 
    2、 输出第i个元素:
        println( arrayOf对象名 [i])输出
   3、 给第i个元素赋值:
       array[i] =Hello(“给第i个成员赋值”)
   4、 拼接整个元素并去除其中的默认“,”
        arrayOfChar .joinToString( “” ) //去除中间的,
    5、字符串切割:取值array中的第2个和第3个元素
       arrayOfInt .slice( 1..2 ) //传入的是一个闭区间的元素
 
数组类型映射
Java type:  int[]  / String []
Kotlin type : kotlin.IntArray /  kotlin.Array<9out) String > !
posted @ 2018-08-30 18:58  想不起来的角落  阅读(241)  评论(0编辑  收藏  举报