constval PI=3.14//定义编译时常量,只能在函数之外定义funmain(){println("hello world")// TODO 声明变量/*
可读可改 变量名 类型 值
* var name : String="mumu";
* *///TODO 内置数据类型/*
String 字符串
Char 单字符
Boolean true/false
Int 整型
Double 小数
List 集合
Set 无重复的元素集合
Map 键值对集合
*///TODO 只读变量val name : String ="mumu"//不可修改的}
2.kotlin的range表达式
val number =101if(number in90..100){println("优秀")}elseif(number in0..60){println("不及格")}elseif(number !in0..100){println("分数不在0到100范围内")}
3.kotlin的when表达式
val week=2//java的if表达式//kotlin的if表达式,有返回值的val info =when(week){1->"今天是星期一"2->"今天是星期二"else->{println("忽略星期几")}}println(info)
4.kt的String模板
val garden="龙山公园"val time =5println("今天去了${garden}玩,玩了${time}个小时")//因为kt的if时表达式,所以可以更灵活;java的if是语句,有局限性val isLogin=trueprintln("server response result: ${if(isLogin)"恭喜,登录成功"else"登陆失败"}")
funmain(){//TODO kt语言的安全调用操作符var name : String?="abc"//name=null//name. //name是可空类型,可能是null,想要用name,必须给出补救措施val r=name?.capitalize()//name是可空类型,如果真的是null,?后面这一段代码不执行,就不会引发空指针异常//todo kt语言中非空断言操作符特点var s=name!!.capitalize()//!! 断言 不管name是不是null都执行//规矩:如果百分百能保证name不是空值,才能使用!!断言,否则空指针异常风险println(r)//TODO kt语言使用带let的安全调用var name1 : String?=null//name1="zhangsan"//name是可空类型,如果真的是null,?后面这一段代码不执行,就不会引发空指针异常var r1=name1?.let{//let可以把name1拿到内部用//it==name1本身//执行到这里 it 一定不为nullif(it.isBlank()){"Default"}else{
it
}}println(r1)//TODO kt语言的空合并操作符println(name1?.let{"【$it】"}?:"原来你是null")}
汇总二
1.kt语言的substring
constval INFO="Muma like kotlin"funmain(){val indexOf=INFO.indexOf("k")println(INFO.substring(0, indexOf))println(INFO.substring(0 until indexOf))//kt语言基本上用此方式 0 until indexOf}
2.kt语言的split操作
val jsonText="mumu,zhangsan,lisi,zhaowu"val list=jsonText.split(",")//list 自动类型推断成 list==List<String>//直接输出list集合 不解构println("分割后的list里面的元素有:$list")//c++ 解构,kt也有解构val(m1,m2,m3,m4)= list
println("解构四个只读变量的值是:m1:$m1,m2:$m2,m3:$m3,m4:$m4")
3.kt语言的replace完成加密解码操作
val sourcePwd="ABCDE"println("原始密码是:$sourcePwd")//加密操作:把字符替换成数字val newPwd = sourcePwd.replace(Regex("[ABCDE]")){when(it.value){"A"->"3""B"->"5""C"->"6""D"->"2""E"->"1"else-> it.value
}}println("加密后的密码是:$newPwd")
4.kotlin语言中== & ===比较操作
val name1="Muma"val name2="muma".capitalize()println(name1 == name2)//trueprintln(name1 === name2)//false
5.字符串遍历
val str ="ABCDEFG"
str.forEach{/*c-> //覆盖掉默认的it参数名,改$it为$c*/print("字符:$it,")}
6.数字类型安全转换函数
val num : Int ="666".toInt()println(num)//字符串放入了double类型,无法转换成Int,会崩溃//例如:val num : Int = "3.14".toInt()//解决崩溃问题val num2 : Int?="3.14".toIntOrNull()println(num2 ?:"原来你是null")//空合并
classKtBase10(){var name="Muma"var value ="ABCD"//下面的隐式代码不写也有get()=field
set(value){
field=value
}var info ="abcd is success"get()=field.capitalize()//把首字母改成大写set(value){
field="**【$value】**"}/* 背后做的事
@NotNull
public final String getInfo() {
return StringsKt.capitalize(this.info);
}
public final void setInfo(@NotNull String value) {
Intrinsics.checkNotNullParameter(value, "value");
this.info = "**【" + value + "】**";
}
*/}//todo field关键字的学习funmain(){//背后隐式代码:new KtBase10().setName("Xiaoxiao");KtBase10().name="Xiaoxiao"//背后隐式代码:System.out.println(new KtBase10().getName);println(KtBase10().name)}
2.计算属性与防范竞态
classKtBase11(){val num : Int =1/* 背后的代码
private int num = 1
public int getNum(){
return this.num
}
*///计算属性 下面这样写 get函数覆盖了field内容 相当于field失效了val num1 : Int
get()=(1..1000).shuffled().first()//从1到1000取出随机值 返回给getNum1()函数/* 背后隐式代码
private int num2;
public int getNum2(){
return (1..1000).shuffled().first() java的随机逻辑
}
* */var info : String ?=""//null//防范竞态条件 当你调用的成员可能为null 可能为空值 就必须采用防范竞态条件 这是KT的规范fungetShowInfo(): String {return info ?.let{if(it.isBlank()){"空值,请检查代码..."}else{"最终结果是:$it"}}?:"null,请检查代码..."}}funmain(){//System.out.println(new KtBase11().getNum());println(KtBase11().num)//new KtBase11().setNum(9)//KtBase11().num=9 //val根本没有setNum()函数,只有getNum()函数println(KtBase11().num1)println(KtBase11().getShowInfo())}
3.主构造函数
classKtBase12(_name:String,_sex:Char,_age:Int,_info:String){//主构造函数var name = _name
get()= field
privateset(value){
field = value
}val sex = _sex
get()= field
val age = _age
get()= field +1val info = _info
get()="【$field】"funshow(){println(name)println(sex)println(age)println(info)}}funmain(){val p =KtBase12(_name ="Muma",_age =17,_info ="学习Kotlin语言",_sex ='男')
p.show()}
4.主构造函数里定义属性
//var name :String 就相当于 var name = _name 只不过看不到而已//一步到位classKtBase13(val name: String,val sex: Char,val age: Int,var info: String){funshow(){println(name)println(sex)println(age)println(info)}}funmain(){val p =KtBase13(name="张三",sex='男',age=18,info="学习Kotlin语言")
p.show()}
5.次构造函数
classKtBase14(name:String){//主构造//2个参数的次构造函数,必须要调用主构造函数。为什么次构造必须调用主构造?主构造统一管理,为了更好的初始化设计constructor(name:String,sex:Char):this(name){println("2个参数的次构造函数,name:$name,sex:$sex")}//3个参数的次构造函数constructor(name:String,sex:Char,age:Int):this(name){println("3个参数的次构造函数,name:$name,sex:$sex,age:$age")}//4个参数的次构造函数constructor(name:String,sex:Char,age:Int,info:String):this(name){println("4个参数的次构造函数,name:$name,sex:$sex,age:$age,info:$info")}}funmain(){val p =KtBase14("张三")KtBase14("张三",'男')KtBase14("李四",'女',18)KtBase14("小小",'女',19,"还在学习Kotlin语言")}
classKtBase18(){//不使用惰性初始化 普通方式// val databaseData1=readSQLServerDatabaseAction()//使用惰性初始化,by lazyval databaseData2 by lazy{readSQLServerDatabaseAction()}privatefunreadSQLServerDatabaseAction(): String {println("开始读取数据库中...")println("加载数据库中...")println("结束读取数据库中...")return"database data load success ok."}}//todo 惰性初始化by lazy//1、不使用惰性初始化:databaseData1=readSQLServerDatabaseAction()//2、使用惰性初始化:databaseData2 by lazy//3、KtBase18() 睡眠 db1.databaseData1//lateinit 是在使用的时候 手动加载懒加载方式,然后在使用//惰性初始化 by lazy 是在使用的时候,自动加载的懒加载方式,然后再使用funmain(){// val p = KtBase18()// Thread.sleep(5000)// println("提示:${p.databaseData1}")val p =KtBase18()
Thread.sleep(5000)println("提示:${p.databaseData2}")}
10.继承与重载的open关键字学习
//默认的类,默认都是final修饰,不能被继承openclassPerson(val name:String){privatefunshowName()="父类 的姓名是【$name】"openfunmyPrint()=println(showName())}classStudent(privateval subName : String):Person(subName){privatefunshowName()="子类 的姓名是【${subName}】"overridefunmyPrint()=println(showName())}funmain(){val person : Person =Student("张三")
person.myPrint()}
汇总六
1.类型转换学习
openclassPerson2(val name:String){funshowName()="父类 的姓名是【$name】"openfunmyPrint()=println(showName())funmethodPerson()=println("父类方法..")}classStudent2(privateval subName : String):Person2(subName){funshowName2()="子类 的姓名是【${subName}】"overridefunmyPrint()=println(showName2())funmethodStudent()=println("子类方法..")}funmain(){val p: Person2 =Student2("张三")
p.myPrint()//检测类型println(p is Person2)//trueprintln(p is Student2)//true//转换类型if(p is Student2){(p as Student2).myPrint()}if(p is Person2){println((p as Person2).showName())}//todo 智能类型转换(p as Student2).methodStudent()
p.methodStudent()
p.methodPerson()
p.methodStudent()}
class KtBase30{//伴生对象companionobject{val info ="MumaInfo"funshowInfo()="显示:$info"}}//伴生对象的由来:在KT中没有java的这种static静态,伴生很大程度上和这种static差不多//无论KtBase30()构建对象多少次,我们的伴生对象加载一次//伴生对象只会初始化一次funmain(){println(KtBase30.info)
KtBase30.showInfo()
KtBase30
KtBase30
KtBase30
}
//普通类classKtBase33(var name : String,var age : Int,var sex : Char){//顺序必须是和成员一一对应operatorfuncomponent1()= name
operatorfuncomponent2()= age
operatorfuncomponent3()= sex
}//数据类dataclassKtBase33Data(var name : String,var age : Int,var sex : Char)funmain(){val(name,age,sex)=KtBase33("张三",78,'男')println("普通类解构后:name:$name,age:$age,sex:$sex")val(name1,age1,sex1)=KtBase33Data("李四",45,'男')println("数据类解构后:name1:$name1,age1:$age1,sex1:$sex1")val(name2,_,_)=KtBase33Data("李四",45,'男')println("数据类解构后:name2:$name2")}
9.plus代表+运算符重载
dataclassAddClass(var num1:Int,var num2:Int){operatorfunplus(p1:AddClass):Int{return(num1+p1.num1)+(num2+p1.num2)}//查看整个kt可以用的运算符重载方式// operator fun AddClass.}funmain(){//kt语言 plus代表+运算符重载println(AddClass(1,2)+AddClass(2,3))}
class KtBase40<T>(privateval obj : T){//万能输出器funshow()=println("万能输出器:$obj")}dataclassStudents(val name : String ,val age : Int ,val sex : Char)dataclassTeachers(val name : String ,val age : Int ,val sex : Char)funmain(){val stu1 =Students("张三",29,'男')val stu2 =Students("李四",19,'男')val tea1 =Teachers("赵武",12,'男')val tea2 =Teachers("刘柳",45,'男')KtBase40(stu1).show()KtBase40(stu2).show()KtBase40(tea1).show()KtBase40(tea2).show()KtBase40(String("小小".toByteArray())).show()KtBase40(23).show()KtBase40(23.4534).show()KtBase40(565.3f).show()}