Kotlin
Kotlin 是一个用于现代多平台应用的静态编程语言 [1] ,由 JetBrains 开发。
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
Kotlin已正式成为Android官方支持开发语言。 [2]设计目标:
创建一种兼容Java的语言
让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
让它比Java更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现。
让它比最成熟的竞争对手Scala语言更加简单。 [3]其基础编译器(他们将其改为kompiler——开创了一系列以K字打头的用语——甚至连
contributors这类词他们也用改成了kontributors)可以被独立出来并嵌入到 Maven、Ant 或 Gradle
工具链中。这使得在 IDE 中开发的代码能够利用已有的机制来构建,从而尽可能的减少了在新环境中使用所受的干预,哪怕与那些没有安装
Kotlin 插件的开发人员一起合作项目也没有问题。 The IntelliJ Kotlin 插件扩展了 Java 编译器使得 Kotlin
代码能够得以编写、编译和调试。除此之外,关于基本的 Java 集合,已经有编写好的帮助函数,可以更顺畅地衔接将在 Java 8
中出现的集合扩展。 有两篇文章对 Kotlin 与 Java 以及 Kotlin 与 Scala
分别进行了比较,对各自特性和异同进行了对比。即便 Scala 可能还是更为强大些,Kotlin 还是尝试着提供比 Java
更好的函数、模式匹配、空指针预防和泛型。该语言同时也支持特征(traits)和模式匹配。 Kotlin 插件在当前版本的 IntelliJ
和 Eclipse 中均已能使用。 [4] Kotlin,类似 Xtend 一样,旨在提供一种更好的 Java
而非重建整个新平台。这两种语言都向下编译为字节码(虽然 Xtend 是首先转换成相应的 Java 代码,再让 Java
编译器完成繁重的工作),而且两者都引入了函数和扩展函数(在某个有限范围内静态地增加一个新方法到某个已有类型的能力)。Xtend 是基于
Eclipse 的,而 Kotlin 是基于 IntelliJ 的,两者都提供无界面构建。能够首先演变到其他 IDE
的语言有可能成为最后的赢家。
题外话(Scala 是纯函数式编程语言) 关于主辅构造器 Kotlin和Scala很像! 相互借鉴
class KotlinMsg (msgStrIn:String) //声明类及主构造器 其实就是在class的时候就声明了然后换了一下声明类型的方式 :String 然后Kotlin只能明确含有一个构造器
{
var msgStr:String?=null //声明并初始化成员变量(var表示可变变量,?表示允许为null) 必须要这么做!
var num:Int=0 //声明并初始化成员变量(var表示可变变量)
//声明lambda表达式函数(val表示只读变量)
val calLambda: (Int) -> Int = {x -> x*4} //能用val就尽量用val 而且lambda在Kotlin中是一等类型地位 也就是等价于 int之类的 这个函数表达式主要是说明 有一个int 变成到另一个int
init //主构造器没有方法体,需要由主构造器完成的工作写在初始化代码块中
{
msgStr=msgStrIn //将构造器参数值记录在成员变量中
}
//声明辅构造器,并代理主构造器
constructor(msgStrIn:String,numIn:Int):this(msgStrIn) //类似与C++
{
var k:Int=numIn //声明辅助变量
k=calLambda(k) //执行计算
num=k; //将结果值记录在成员变量中
}
fun getMsg(): String //获取结果字符串的方法 返回值是String
{
return msgStr+num
}
}
class MainActivity : AppCompatActivity() //继承
{
override fun onCreate(savedInstanceState: Bundle?) //覆盖
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//获取用于显示内容的TextView
val tv=findViewById(R.id.tvmsg) as TextView //不用括号 而是as
//将结果内容显示到TextView中
tv.setText(GenerateMSG.getMsg());
}
}
下面我们来分析一个有趣的东西
在java代码中创建Kotlin类 然后传入两个参数
不过你看 在Kotlin的主构造器只接受到了一个参数 而辅构造器收两个参数
这是什么原因呢然后怎么解释呢?
个人解释:传入的参数调用了辅构造器 然后通过this 再去调用主构造器
如果有错误 欢迎评论 !!
Kotlin中的
关于初始化代码是在类加载(类加载的同时构造器也在加载)之前的 (顺序不是很重要)
init 代码块的主要目的是给主构造器传入的参数赋值 !!
(初始化语句块用于配合构造方法给属性赋初始值)
Java中的
关于类加载时所注意的点
这个博主写的也很优秀!!
总结
体会了kotlin的 类 主构造器 以及主构造器的参数传递 (可以直接一步完成 在参数传递的时候直接给传入的参数来定义变量)
如://构造函数和java类似带默认参数 然后constructor 可以省略!class Main (val id:int ,val name:String)
仅仅一行代码就加载了类 构造器 并且给构造器赋值了 Kotlin 确实简洁了许多!
下面来Kotlin 的规范版本
class Main constructor(id:int , name :String){
val id:int
val name:String?=null
init{
this.id=id
this.name=name
}
}
这是翻译成java的版本:
class Main{
private int id ;
private String name ;
public Main(int id,String name){
this.id=id;
this.name = name ;
}
}
然后 变量var 和val (不可修改的变量)的定义 以及对象类型的数据类型 赋值要 ?=null 不然会出错
如 s:String ?=null
然后 辅构造器
constructor(id:int,name :String,):this(id,name)
然后 初始化 语句 前面代码体现过了
然后 函数 fun 的定义以及 使用
fun getMsg(): String //获取结果字符串的方法
{
return id+“ ”+name
}
还有 继承
open class 或者 abstract class 的话就能继承
因为Kotlin 默认的 是final class !!!
还有强制类型转换用as
val tv=findViewById(R.id.tvmsg) as TextView