上篇我们介绍了Kotlin环境搭建,这篇,我们来愉快的编写Kotlin代码吧!
Hello Kotlin
按照编程世界的习惯,我们先跟kotlin打声招呼
fun main(args: Array<String>) {
println("Hello World ")
}
会发现右边有个kotlin
小角标,点击run
即可运行
1. 类
1.1 类参数
最简单的无默认参数类,默认都是public的
class PerSon {
}
创建一个对象
val perSon = PerSon();
省略了关键字new
, 返回值类型默认为val
,当然这里你也可以改为var
var
和val
区别在于;
var
:可变变量,类似于Java中没加final
修饰的变量
val
:不可变"变"量,类似于Java中加了final
修饰的变量,不可变元素有很多优点,线程安全,高效,不易出错,kotlin官方建议除非特殊情况,一般建议都用val
1.2 如果想要带默认参数的 则必须在类上说明
class PerSon(name: String, arg: Int) {
}
可以看出
1. kotlin中,方法参数默认都是 参数名:参数类型
方式的,这点跟Java刚好相反
2 .Int
类型为大写,默认是包装类型,kotlin中将包装类型和普通类型统一,全部用包装类型,内部优化了包装类型,保证程序效率,所有的int
,long
,double
等全部用Int
,Long
,Double
;
等效于于Java中的:
class PerSon {
PerSon(String name,int arg){
}
}
如何保存默认参数的值呢?Kotlin中的Init
函数登场,等效于Java中的构造函数
class PerSon(name: String,arg: Int) {
var name:String
var arg:Int
init {
this.name=name;
this.arg=arg;
}
}
还在用Java写法,每加一个参数改一次构造函数吗,kotlin有更加优雅的方式
class PerSon(name: String,arg: Int) {
var name=name
var arg=arg
}
最终版:
class PerSon(var name: String, var arg: Int) {
}
妈妈再也不用担心构造函数参数太长了,
外界调用
val perSon = PerSon("")
println("person person name=${perSon.name} arg=${perSon.arg}")
输出信息只需要中 prinln
即可,再也不用写一大长串 system.out.println
了,同时连接函数/字段更加简单.只需要 ${}
包裹即可;
类属性
1.1 类的属性用var
(可变)或者val
(不可变,类似于Java中的final)修饰,
class KotlinClass {
var name: String = "KotlinClass"
var args: Int = 20
}
注意:kotlin中成员变量强制赋值,一个字段要么立即被赋值,要么声明可为空,而不是Java,都有默认值;
但是,如果我不想现在赋值怎么办,用关键字lateinit
class KotlinClass {
lateinit var name: String
}
这对Android程序猿特别有效,比如 传递参数
class MainActivity : AppCompatActivity() {
lateinit var perSon:PerSon
override
fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
perSon = PerSon("")
}
fun method(){
println(perSon.arg)
}
我们需要在两个方法之间共享person
这个对象,抽取成成员变量后使用
构造方法
Koltin 中的类可以有一个 主构造器,以及一个或多个次构造器
1. 主构造器
主构造器是类头部的一部分,位于类名称之后,用关键字constructor
标明:
class PerSon constructor(var name: String, var arg: Int) {}
当然,constructor
在主构造器没有任何注解,也没有任何可见度修饰符,也可以忽略
class PerSon(var name: String, var arg: Int) {}
主构造器的参数,可以在init
方法中使用,init
方法是对象第一个执行的方法
init {
System.out.print("FirstName is $name")
}
2. 次构造器
类可以有多个次构造器,次构造器用constructor修饰
class PerSon () {
init{
//主构造函数
}
// 次构造函数
constructor (num :Int) : this() {
println("Alexa 排名")
}
这个this()
又是什么鬼👻,
其实就是Java中的this.(xxx)
,构造函数调用其他的构造函数,不过,Java是写在方法里面,而kotlin
是写在外面而已,
来一个自定义View的代码,
class ConstomView : View {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
}
三个构造函数全部被重载
fun main(args: Array<String>) {
print("Hello kotlin")
}
类及类中的成员变量到此也就讲完了,接下来是类中的函数
1.3 函数
1. 函数
定义一个函数,以fun
开头,如果有返回值,写在最后
fun sum(a:Int,b:Int): Int {
return a+b;
}
可以进一步简写为:
fun sum(a:Int,b:Int)= a+b
返回值类型自动推断
方法体默认也是public
的,可以被外界任意调用,当然,也可以改为private
2. 默认参数
方法参数可以有默认值,比如
fun sum(a:Int,b:Int=10)= a+b
外界调用,则参数b
可以不传,默认是10,这减少了很多方法重载
比如我要通过方法打印Hello world
,后面默认为kotlin,也可以是其他语言名称
fun print(str1: String, str2: String, str3: String = "kotlin"){
println("$str1 $str2 $str3")
}
调用:
fun print(str1: String, str2: String, str3: String = "kotlin"){
println("$str1 $str2 $str3")
}
输出:
Hello world kotlin
Hello world Java
注意,默认参数必须在参数列表
后面
同时又学到了一个$
的用法;$
在kotlin中称之为字符串模板,打印字符常用
$ 表示一个变量名或者变量值
$varName 表示变量值
${varName.fun()} 表示变量的方法返回值:
var a = 1
val s1 = "a is $a" // s为 a is 1
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a" //replace方法执行
3. 可变参数
kotlin默认参数用关键字vararg
表示,如:计算一个输入值总和:
fun sum(vararg a:Int): Int {
var sum=0
for (i in a) {
sum += i
}
return sum;
}
调用
perSon.sum(1,2,3,4,5)
输出:15
4. NUll检查,空指针安全
这个特性估计是Kotlin最吸引Java程序员的,每次遇到NullPointException都是一堆的火,kotlin提供?
来检测
fun method(name: String?): Int? {
if (name!=null){
return name.toInt()
}
return null
}
详细解读下代码:
方法参数可以为null
,则?
加在类型String
后面
返回值可以为null
,则?
加在类型Int
后面
也可简化为
fun stringToInt(name: String?): Int? {
return name?.toInt()
}
调用一个对象方法前,加一个?
保证安全,如果对象为null,则不调用方法
,有返回值的,返回为null
5. get 和 set
kotlin默认实现getter 和 setter ,其中,var
修饰的默认带get
和set
,而val
修饰的只有get
,因为是不可变的,妈妈再也不用担心get set方法几百行了,瞬间,整个世界清净了!!
如果我要自己去定义get/set怎么办
class People {
var name: String
get() = "mr" + name
set(value){
"mr"+name
}
}
直接在属性后跟上get
和set
方法,修改默认的业务逻辑
总结:
这章主要讲解了Kotlin的类和方法的一些特性,简洁,高效,丰富的语法糖,大大提高了编码效率,由于篇幅有限,部分知识点(坑)为全面描述,建议各位童鞋多多动手为主,人生苦短,我用Kotlin;
这个系列我会连载下去,欢迎各位看官关注!
也欢迎start,issue我的GitHub,
- 便捷的利用fragment替代Activity创建页面,自带任务栈,返回栈;
-
高效读取序列帧,序列帧动画必备,内存复用,千张图片只使用一张图片的内存;