现在在学kotlin,在网上找例子教程,想通过例子来快速学习,但是多年保留下来的习惯让我打开源码看。今天遇到的就是String.
在使用java的时候,我记得有面试官问过我String 能否继承重写,当时我是不知道的,他说String 是final类型,所以是不可以的,今天我打开了kotlin 的String ,发现它是public!!!这就意味着我们可以对它为所欲为,如果是java,那就真的可以为所欲为了,可惜它是kotlin,这个String一样是不能继承重写,因为kotlin可继承的类的关键字是open,String类并没有用open关键字标注,所以public class String{}等同于java的 public final class String{},哈哈,所以说就算怎么吹java可以快速的切换到kotlin,还是有很多坑给你跳,让你知道你还是要老老实实的去学一遍kotlin的。
先看源码:
String.kt的源码
package kotlin
//'String'类代表字符串类型。所有的字符串在kotlin中都是作为这个类的实例实现的
public class String : Comparable<String>, CharSequence {
companion object {}
/**
* 就是把两个字符串连接起来获得一个新的字符串
*/
public operator fun plus(other: Any?): String
//字符串长度
public override val length: Int
/**
* 返回字符串中index位置上的字符
*
* index的大小超出了字符串长度的, Kotlin/JS会抛出 java.lang.StringIndexOutOfBoundsException的[IndexOutOfBoundsException] 异常
*/
public override fun get(index: Int): Char
//截取字符串从startIndex到endIndex的字符并返回
public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence
//对比字符串和other字符串,值相等返回0,如果字符串比other字符串小就返回负数,比other字符串大就返回正数
public override fun compareTo(other: String): Int
}
下面开始自我的废话
上面的compareTo我没弄明白它是用地址大小做对比还是转为AC码作为比较得出正负值的,我水平还没够,也找不到答案,所以期待某天可以翻到这个的答案。
翻看源码,这个compareTo是Comparable接口的实现方法,Kotlin中有六个类都实现了这个接口:Duration、KotlinVersion、UByte、UInt、ULong、UShort。所以可以直接通过compareTo获取到时间比较、kotlin版本比较、数字比较的结果。
其实我也不太看得懂这个String类,因为我看不到String类中实现了接口方法的实现代码在哪里。所以我只能看到可以使用的方法,我不知道它的实现过程,这点java中就可以直接通过看源码看到它是怎么实现的,可能我查看kotlin的源码看错了,或许它在源码中有实现的代码,但是我看不懂,没有发现真相的眼睛…
上面中含有override关键字的就是接口中要实现的方法,虽然没明白它没有{代码实现}这一部分,但不妨碍我见名知意,知道它们是做什么的。
上面还有个比较难懂的关键字operator,我去百度搜了它,我明白了它的意思,我也想记录下来的,但是我明白了它的意思,但我按照不了自己的想法去写下来,所以记一下别人的笔记吧:运算符重载operator
还有个难明白的地方就是为啥要写companion object {}
这一句?我明白这是相当于静态对象方法,但是里面也没有要写的静态的方法或者静态变量,所以这一句的意义是什么,我去百度了也没有百度到,也是一个未解之迷,希望以后写多看多了就明白了吧
String.kt中的方法使用
operator fun plus(other: Any?): String
把两个字符串连接起来获得一个新的字符串
operator:重载方法
plus(other: Any?):plus函数就代表+,所以str.plus(other)可以直接写成我们非常熟悉的str+other
var str1="hello"
var str2="world"
//str1.plus(str2)和str1+str2的结果都是 helloworld,它们两是等价的
println(str1.plus(str2))
println(str1+str2)
override val length: Int
获取字符串的长度
override:重写父类CharSequence接口中的方法或变量
val:只读变量
var str1="hello"
var strLen = str1.length
println(strLen) // 结果为5
override fun get(index: Int): Char
返回字符串中index位置上的字符
index的位置超出了字符串长度则 抛出 StringIndexOutOfBoundsException异常
也是CharSequence接口中的方法
var str1="hello"
var strGetChar = str1.get(3)
println(strGetChar) // 结果为l
override fun subSequence(startIndex: Int, endIndex: Int): CharSequence
返回字符串中从[startIndex,endIndex)位置截取到的新字符串
也是CharSequence接口中的方法
var str1="hello"
var subSequence = str1.subSequence(1, 3)
println(subSequence) //结果为el
override fun compareTo(other: String): Int
字符串比较,值相等返回0,如果字符串比other字符串小就返回负数,比other字符串大就返回正数
Comparable接口的方法
var str1="hello"
var str2="world"
var compareTo = str1.compareTo(str2)
println(compareTo) // 不相等,结果为-15
var str3="hello"
var compareTo1 = str1.compareTo(str3)
println(compareTo1)//相等,结果为0
在类中只有上面的这些方法,我还得找找其他的字符方法