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很像! 相互借鉴

android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Kotlin


android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_02


android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_03


android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_04


android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_05


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());
    }
}

下面我们来分析一个有趣的东西

android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Kotlin_06


在java代码中创建Kotlin类 然后传入两个参数

不过你看 在Kotlin的主构造器只接受到了一个参数 而辅构造器收两个参数
这是什么原因呢然后怎么解释呢?
个人解释:传入的参数调用了辅构造器 然后通过this 再去调用主构造器
如果有错误 欢迎评论 !!

android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Kotlin_07


Kotlin中的
关于初始化代码是在类加载(类加载的同时构造器也在加载)之前的 (顺序不是很重要)
init 代码块的主要目的是给主构造器传入的参数赋值 !!
(初始化语句块用于配合构造方法给属性赋初始值)

Java中的

android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_08

关于类加载时所注意的点

android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_09


android 项目怎么设置 java kotlin同时开发 android开发语言kotlin_Java_10

这个博主写的也很优秀!!

总结

体会了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