kotlin学习笔记一

1.HelloWorld

fun main(args: Array<String>) {//相当于Java的main()函数

      println("Hello Kotlin!")

2.Kotlin当中的基本数据类型(与Java有些不同)

Kotlin当中的基本数据类型基本上和Java差不多,但是不存在装箱和拆箱的概念,还有就是声明那可真不太一样:

变量的声明涉及到两个关键字:

Kotlin中有两个关键字定义变量,这两个关键字外形看着差别很小就只差了一个字母,但实际差别很大的。

var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和Java中声明变量的方式一样。

val是一个只读变量,这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。

注意的是Kotlin当中并不存在int和Integer等类似的基础类型对应的关键字,而只存在Int,Byte,Boolean等等基础类型关键字,所以根本不存在拆箱和装箱。有同学以为我值域是不是忘记填啦,我当然不是忘记啦!这要靠你们自己来完成填写,Kotlin当中获取基础类型的最大值和最小值非常简单,比如,我拿Int类型为例:

var maxInt:Int = Int.MAX_VALUE
println("Int类型的最大值是:"+maxInt)

var minInt:Int = Int.MIN_VALUE
println("Int类型的最小值是:"+minInt)

3.Java支持自动类型转换,Kotlin可不支持

Java当中char–>int–>long,int—>float等等都可以自动转换,Kotlin可不支持,为啥呢?降低不必要的错误

4.Java当中的原始祖类是Object,而Kotlin却是Any

Kotlin当中Any的源码如下:

package kotlin

/**
 * The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
 */
public open class Any {
    /**
     * Indicates whether some other object is "equal to" this one. Implementations must fulfil the following
     * requirements:
     *
     * * Reflexive: for any non-null reference value x, x.equals(x) should return true.
     * * Symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
     * * Transitive:  for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true
     * * Consistent:  for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
     *
     * Note that the `==` operator in Kotlin code is translated into a call to [equals] when objects on both sides of the
     * operator are not null.
     */
    public open operator fun equals(other: Any?): Boolean

    /**
     * Returns a hash code value for the object.  The general contract of hashCode is:
     *
     * * Whenever it is invoked on the same object more than once, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.
     * * If two objects are equal according to the equals() method, then calling the hashCode method on each of the two objects must produce the same integer result.
     */
    public open fun hashCode(): Int

    /**
     * Returns a string representation of the object.
     */
    public open fun toString(): String
}

这个Java当中的Object比较有着很大的不一样,Any只存在着三个方法:
equals(),hashCode,toString,要想知道为什么,就坚持学到后面,答案会揭晓的。

5.Kotlin如何处理空指针?

在学习这个问题之前,我们回想一下我们在敲写Java代码的时候如何处理java当中的空指针呢?比如:我们在设计Android新闻客户端就经常需要处理的问题:

public static String  getNetJson(){
    String strJson = "";//存储网络请求的Json格式的数据

    //当从服务器请求到数据
    //return json

    //当服务器端异常的时候
    return null;
}
public static void main(String[] args){
    //解析Json格式数据
    String strJson = getNetJson();
    if(strJson != null){
       //解析数据并且将把数据显示到控件上
    }else{
        //提示用户,服务器异常,数据请求失败
    }
}

上述代码只是伪代码,不是真实的功能代码,你可以看出,Java处理空指针真是繁琐麻烦,那么Kotlin如何处理呢?其实Kotlin已经将空类型进行隔离处理了,什么是隔离处理呢?
Kotlin当中所有的类型都分为“可空类型”和“非空类型”,比如:”String”和”String?”,String就是非空类型,String?就是可空类型,非空类型是不允许被null赋值的,否则,代码会编译报错,而可空类型就是可以允许被null赋值,比如以下方法是会报错的:

fun getNetJson():String{
     return null;//String是非空类型的,所以编译不能通过
}

那么如何处理null类型呢?

 println(getNetJson()?.length)//当getNetJsonwei为null时输出null,不为空时输出getNetJson()的长度   
 getNetJson?.return//当getNetJsonwei为null时返回

还有一种情况,当你使用的是可空类型,比如一下代码:

 var str:String? = "dsada"
 println(str.length)//编译器报错,因为str可能为null,为null的时候是不能调用length的

有时候我们特别肯定尽管我的变量是声明的可空类型,但是肯定不会出现null的情况,那么你可以这么写,从而告诉编译器,放心编译把,肯定没null值的:

var str:String? = "dsada"
println(str!!.length)

这么一比较,是不是觉得Kotlin处理null指针太人性化了啊。

6.KotLin中的类型转换

Java当中的类型转换是指存在继承关系的,子类可以向上自动转型为父类,而父类转子类则需要强制转换。而Kotlin中的类型转换是使用as关键字

fun main(args: Array<String>) {
   var  p:Person? = Student("ellen",23)
   var  s:Student? = p as Student//把Person类型的p转换为Student类型
   println(s?.name+":"+s?.age)
}

class Student(name: String, age: Int) : Person(name, age) 
open class Person{
     public var name:String = ""
     public var age:Int = 0
     constructor(name:String,age:Int){
        this.age = age
        this.name =name
     } 
 }

7.Kotlin中的外号是咋回事儿?

当你的村子里出了一个3胞胎,长的一摸一样,那么如何区分他们呢?如同Java当中在一个类中同时使用了多次名字相同但是包名路径不一样的类,Java当中是这么处理的,就是带上包路径来区分,这样真是太繁琐麻烦了,每次使用都还要加上包路径,简直都不能好好敲代码了,Kotlin就不存在这种麻烦,Kotlin处理这种情况的方法叫别名机制,就是“取个外号”,用外号来区分它们。比如下面的代码:

A包的Student

package A
open class Student{
    init {
        println("俺是A包中的Student")
    }
}

B包的Student

package B
open class Student{
    init {
        println("俺是B包中的Student")
    }
}

C包的Student

package C

import A.Student as AS//将A包下的Student类取外号为"AS"
import B.Studnet as BS//将B包下的Student类取外号为"BS"

open class Student{
     init {
       println("我是C包中的Student")
     }
}

fun main(args: Array<String>) {
   var astudent:AS = AS()//通过外号来创建实例对象
   var bstudent:BS = BS()//通过外号来创建实例对象
   var cstudent:Student = Student()
}

输出:
俺是A包中的Student
额是B包中的Student
我是C包中的Student

8.Kotlin的“区间”

Java当中并没有区间的类,这是Kotlin独特具有,类名叫Range

整型区间:

var intRange:IntRange = 0..1024//区间为[0,1024],注意是全闭的
var intRange2:IntRange = 0 until 1024//区间为[0,1024),注意是半闭半开的,包头不包尾
println("50是否存在与区间[0,1024]:"+intRange.contains(50))
println("-3是否存在与区间[0,1024):"+intRange.contains(-3))
//遍历区间
for(i in intRange){
    println(i)
}

9.Kotlin的数组

class Teacher(var name:String,var age:Int){}
fun main(args: Array<String>) {
    var intArray:IntArray = intArrayOf(2,3,4,5)//Int数组
    var teacherArray:Array<Teacher> = arrayOf(
                              Teacher("庞统",53),
                              Teacher("刘备",44),
                              Teacher("关羽",43),
                              Teacher("张飞",42))//Teacher数组
    //数组的修改
    teacherArray[0] = Teacher("诸葛亮",40)

    //数组的遍历
    for(i in intArray){
         println(i)
    }
    for(teacher in teacherArray){
         println(teacher.name+":"+teacher.age)
    }
}

输出:
2
3
4
5
诸葛亮:40
刘备:44
关羽:43
张飞:42

10.kotlin中的 “==” 与 “===”

在kotlin中”==”就是equals()的功能,比较的内容,而“===”判断的是两个的引用值,也就是判断这两个引用是否指向同一个对象,代码演示:

var intRange1:IntRange = 0..1024
var intRange2:IntRange = 0..1024
println(intRange1 == intRange2)
println(intRange1 === intRange2)

输出:
true
false

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容