网站怎么发布到服务器,wordpress 自动评论软件,做系统的图标下载网站,米拓企业网站管理系统目录
一#xff0c;变量声明
1.1 var和val
1.2 类型推断
1.3 Null安全
1.3.1 处理可为null性
二#xff0c;条件语句
2.1条件语句与条件表达式
2.2 智能类型转换
三#xff0c;函数
3.1 简化函数声明
3.2 匿名函数
3.3 高阶函数
四#xff0c;类与对象
4.1 构…目录
一变量声明
1.1 var和val
1.2 类型推断
1.3 Null安全
1.3.1 处理可为null性
二条件语句
2.1条件语句与条件表达式
2.2 智能类型转换
三函数
3.1 简化函数声明
3.2 匿名函数
3.3 高阶函数
四类与对象
4.1 构造函数
4.1.1 主构造函数
4.1.2 次构造函数 一变量声明
1.1 var和val
Kotlin使用两种关键字var和val来修饰变量
val用于修饰无法被修改的变量类似于java中的finalvar用于修饰可变的变量
//var可变
var a : Int 1
a 2//val不可变
val str : String Kotlin
Kotlin中声明变量时是先声明变量名称再声明变量类型。Kotlin的基本数据类型包括Boolean Int Float Long Double等均为大写开头与java不同Char和String不属于数值类型属于一个独立的数据类型
1.2 类型推断
在Kotlin中为某个变量赋初值后Kotlin编译器可根据初始的类型推断变量的类型
//根据“Kotlin”推断str类型为String
val str Kotlin//String类型方法正常调用
str.toUpperCase()//其他类型方法不可调用
str.inc()
这里编译器根据“Kotlin”推断变量str类型为String于是str可以调用String类型的方法而不可调用Int类型的方法inc
1.3 Null安全
Kotlin提供了严格的可为null性规则与java不同默认情况下Kotlin变量不可为null值
val str : String null//不可这样声明默认情况下不可为null
如果想要使变量可为null需要在声明变量时在数据类型末尾加上
val str : String? null
在java中默认情况下变量是可以为null的方法的调用者为null时就会出现空指针异常NullPointerException
而在Kotlin中对于这些可为null值的变量Kotlin提供了多种机制来安全地处理它们
1.3.1 处理可为null性
1使用 ?. 安全调用方法调用者为null时返回null而不是空指针异常
var str3 : String? null;//3.1 ?.安全调用方法调用者为null时返回null
println(str3?.length); //输出null
2使用 !!. 非null断言运算符表示告诉编译器方法的调用者绝不为空但是如果方法的调用者为null就会报空指针异常所以这种方法要谨慎使用
var str3 : String? null//3.1 !! 非null断言运算符 str3为null时报空指针异常
str3 str3非null
println(str3!!.length) //输出str3非nullstr3 null
println(str3!!.length) //空指针异常
3使用 ?: Elvis运算符提供一个默认值在方法调用者为null时返回默认值
var str3 : String? null//3.2 ?: Elvis运算符
val str3Length : Int str3?.length ?: 0;
println(str3Length) //输出0
二条件语句
2.1条件语句与条件表达式
Kotlin中同样可以使用if-else语句来处理条件逻辑
if (count 42) {println(I have the answer.)
} else if (count 35) {println(The answer is close.)
} else {println(The answer eludes me.)
}
条件表达式Kotlin条件语句的结果可作为表达式结果返回
var count : Int 1;var str4 : String if(count 1){hello
}else if(count 2){world
}else{hello world
};println(str4); //输出hello
如果你在Kotlin中使用if-else条件表达式Kotlin会建议你替换为when表达式当条件语句复杂时明显when表达式更简洁
count 3;
str4 when{count 1 - hellocount 2 - worldelse - hello world
};
println(str4); //输出hello world
2.2 智能类型转换
Kotlin的条件语句还可以用来安全处理变量的可为null性当条件语句判定变量不为null时我们就不必使用安全调用运算符或非null断言运算符来调用方法
//4.1 智能类型转换
var str6 : String? xdyd;
//str6可能为null
println(str6?.length)
//str6一定不会为null
if(str6 ! null){println(str6.length)
}
三函数
Kotlin中可以使用函数来封装功能可以接收参数声明函数时同样是类型后置
fun getAnswerString(count : Int) : String{val ans: String when{count 1 - hello worldcount 1 - xxxelse - yyy};return ans
}3.1 简化函数声明
当函数返回单个表达式的值时可以直接返回条件表达式
fun getAnswerString(count : Int) : String{return when{count 1 - hello worldcount 1 - xxxelse - yyy};
}也可以将 return 关键字替换为赋值运算符
fun getAnswerString(count : Int) : String when{count 1 - hello worldcount 1 - xxxelse - yyy
}
3.2 匿名函数
在Kotlin中函数可以没有名称只通过输入输出来表示我们称之为匿名函数
val getStringLength fun (str : String) : Int{return str.length
}
匿名函数既可以看作是函数也可以看作是一个对象或者说是在把函数当作对象来使用就像上边我们将匿名函数赋值给了getStringLength变量
匿名函数也可以通过lambda表达式的方式表示我们也可以这样理解getStringLength是一个函数类型的变量String- Int 就是函数类型表示接收一个String类型的参数返回Int类型的值
val getStringLength : (String) - Int {//参数名称可以自定义这里为input就是上面String类型的参数input - input.length
}
匿名函数通常作为高阶函数的参数来使用
3.3 高阶函数
一个函数可以将另一个函数作为参数来使用我们称之为高阶函数
//5.3 高阶函数 将其他函数作为参数的函数 下面这个函数需要接收一个字符串和一个函数
fun stringMapper(str : String, mapper : (String) - Int) : Int {return mapper(str);
}//高阶函数的调用传入了一个字符串和一个(String) - Int类型的匿名函数
stringMapper(android nb, getStringLength)val getStringLength : (String) - Int {input - input.length
}
当高阶函数的最后一个参数为匿名函数时匿名函数可以写在圆括号之外
stringMapper(android nb) { input - input.length }
除了匿名函数之外高阶函数也可以使用命名函数来作为参数使用命名函数作为参数时需使用 :: 来创建函数类型对象也就是说被 :: 修饰的函数可以作为对象来使用
stringMapper(android nb, ::getMapper)fun getMapper(str : String) : Int{return str.length
}
四类与对象
Kotlin中同样使用 class 来定义类类中可以包括成员变量成员方法构造函数代码块内部类等这些与java都相同与java不同的是实例化类时不需要new关键字
//6. 类 构造方法
class Person(){//成员变量private var name : String //成员方法fun getName() : Int{return name.length}fun setName(name : String){this.name name}//内部类class man(){}
}//类的实例化
val person : Person Person()
需要注意的是在Kotlin中变量的声明和初始化必须同时进行如果想要推迟变量的初始化可以使用 lateinit 关键字修饰
例如在使用Android的fragment时
class HomeFragment() : Fragment() {//Kotlin必须在声明变量时初始化使用lateinit可以推迟初始化private lateinit var btn_add : Buttonoverride fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {var view inflater.inflate(R.layout.item_mine, container, false)//初始化btn_add view.findViewById(R.id.btn_mine)return view}
}
4.1 构造函数
4.1.1 主构造函数
Kotlin中类的主构造函数可以写在类的头部
class Person(var name : String, private var age : Int){}
等同于java代码中这种写法
public class Person {String name;private int age;public Person(String name, int age){this.name name;this.age age;}
}
由于主构造函数不能包含任何代码块所以我们可以使用初始化程序块来进行一些除初始化之外的操作初始化程序块使用 init 关键字来修饰
class Person(name : String, age : Int){var myName : Stringvar myAge : Intinit{myName namemyAge ageprintln(myName)println(myAge)}
}
4.1.2 次构造函数
次构造函数使用 constructor 关键字定义用于提供多个构造方式。如果需要定义多个构造函数或者需要一些额外的初始化逻辑可以使用次构造函数
如果此构造函数中没有接收全部的成员变量参数必须给成员变量赋初值
class Person {val myName: Stringvar myAge: Intconstructor(name : String){myName namemyAge 18}constructor(name : String, age : Int){myName namemyAge age}
}
如果类已经定义了主构造函数那么次构造函数必须显示调用主构造函数
class Person(val name: String, var age: Int) {constructor(name: String) : this(name, 0) {// 构造逻辑}
}如果你需要定义一个无参构造函数必须要给给主构造函数的参数提供默认值
class Person(val name: String Unknown, var age: Int 0)val person Person() // 使用默认值可以看出Kotlin似乎一直在避免一件事声明的变量没有初始值或者说声明的变量为null。这也是Kotlin null安全的一角啊