Kotlin&Java对照学习笔记

来源:互联网 发布:uefi ubuntu 双系统 编辑:程序博客网 时间:2024/05/29 19:13

常用基本语法

  1. 同Java,用class关键字声明类;不同之处是声明类的同时可以默认构造:

    class SampleClass(val1:String,val2:Int,...){init{ ...//init块}}

    上面的方式默认了类SampleClass带val1和val2的构造(Kotlin中变量参数均以[参数名称]:[参数类型]的形式给出)
    如要写构造函数的函数体内容,则在init块中写出.

    2.用:表示继承关系,Any是所有类的父类,和Java中的Object类类似.所有的类默认都是不可继承的(final),可以通过在类前添加open/abstract关键字表示该类可以被继承,形如:

    open class SampleClass(...){...}

    3.用关键字fun定义函数,返回类型通过在函数声明后用:类型名给出:

    fun foo(val1:String,val2:Int...):Int{ return 0;}

    上述函数foo返回一个Int型变量

    4.若进行函数参数变量默认初始化赋值,则可以在调用时不输入参数或指定入参值,优化了Java的函数重载:

    fun ShowMsg(ctx:Context,msg:String,len:Int=Toast.LENGTH_LONG){ Toast.makeText(ctx,msg,len).show()}using fun ShowMsg in UI ,for example,an Activity,like the following:ShowMsg(this,"hello") // don't need to override this method ShowMsg(this,Toast.LENGTH_SHORT)

    5.列表及适配器的使用:

    新建MyAdapter适配器类(用持有者模式实现item复用),继承自BaseAdapter:

    “`
    package com.example.nc039.util
    import android.content.Context
    import android.view.View
    import android.view.ViewGroup
    import android.widget.BaseAdapter
    import android.widget.TextView
    import com.example.nc039.myapplication.R

/**
* Created by NC039 on 2017/5/31.
*/
class MyAdapter(val list:ArrayList,val context: Context):BaseAdapter(){
override fun getItem(p0: Int): Any {
return list.get(p0)
}

override fun getItemId(p0: Int): Long {   return p0.toLong()}override fun getCount(): Int {    return list.size}//p0->position,p1->layout_viewoverride fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { var holder:TestViewHolder var v:View    if(p1==null){//如果项为空,则将inflate的view赋给它        v=View.inflate(context,R.layout.list_item,null)        holder=TestViewHolder(v)        v.tag=holder//在该项打上持有者标签    }else{        v=p1;//如果不为空,则复用已有的p1代表的View        holder=v.tag as TestViewHolder//将p1的持有者标签传递到现在的项上    }    holder.str.text=list[p0]   return v;}//自定义内部类View持有者TestViewHolder,复用Viewclass TestViewHolder(var viewItem: View) {    //通过findViewById找到对应的list_item里的textView    var str: TextView = viewItem.findViewById(R.id.tvstr) as TextView}

}

“`

“`
package com.example.nc039.myapplication
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.example.nc039.util.MyAdapter
import kotlinx.android.synthetic.main.activity_main2.*
class Main2Activity : AppCompatActivity() {
private var list=ArrayList()
private var my_adapter:MyAdapter?=null //初始化赋值为空

override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    setContentView(R.layout.activity_main2)    tv_kt.text="App列表"    list.getData()    my_adapter= MyAdapter(list,this)//对象实例化    list_kt.adapter=my_adapter//给列表添加实例化的适配器}//通过类名.函数名的形式自定义类的新方法fun ArrayList<String>.getData(){    for(i in 0..20){        this.add("我是第"+i+"行")    }}

}

“`

6.Kotlin中用or和and关键字替代Java中的|和&&衔接并列表达式:

“`
// Java
int bitwiseOr = FLAG1 | FLAG2;
int bitwiseAnd = FLAG1 & FLAG2;

// Kotlin
val bitwiseOr = FLAG1 or FLAG2
val bitwiseAnd = FLAG1 and FLAG2

“`

7.Kotlin中可省略:参数类型名,支持自动类型推导:

“`
val i = 12 // 一个Int类型
val iHex = 0x0f // 一个十六进制的Int类型
val l = 3L // 一个Long类型
val d = 3.5 // 一个Double类型
val f = 3.5F // 一个Float类型

“`
8.String支持像数组一样的遍历:

“`
val s = “Sample”
for(c in s){
print(c)
}

“`
9.变量可以很简单地定义成可变(var)和不可变(val)的变量。在Kotlin中,如果我们想使用不可变性,我们编码时思考的方式需要有一些改变。一个重要的概念是:尽可能地使用val。除了个别情况(特别是在Android中,有很多类我们是不会去直接调用构造函数的),大多数时候是可以的。

10.省去了类构造时的属性字段的getter和setter:

//Java中:public class Person {    private String name;    public String getName() {        return name;    }    public void setName(String name) {         this.name = name;    }}...Person person = new Person();person.setName("name");String name = person.getName();//Kotlin中:public class Person {    var name: String = ""}...//有点类似于Java中该类的name字段是public的,可以直接获取.val person = Person()person.name = "name"val name = person.name

一些新特性

1.扩展函数,它是指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权限。这是一个在缺少有用函数的类上扩展的方法。在Java中,通常会实现很多带有static方法的工具类。Kotlin中扩展函数的一个优势是我们不需要在调用方法的时候把整个对象当作参数传入。扩展函数表现得就像是属于这个类的一样,而且我们可以使用this关键字和调用所有public方法。

就像我们之前提到的

//通过类名.函数名的形式自定义类的新方法    fun ArrayList<String>.getData(){        for(i in 0..20){            this.add("我是第"+i+"行")        }    }

这里就利用到了扩展函数这个新特性,我们并没有ArrayList这个类的所有的访问权限,但是我们可以通过定义新的扩展函数让它来帮助我们完成一些有用的工作.

又比如,举个例子,我们可以创建一个toast函数,这个函数不需要传入任何context,它可以被任何Context或者它的子类调用,比如Activity或者Service:

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {    Toast.makeText(this, message, duration).show()}

这个方法可以在Activity内部直接调用:

toast("Hello world!")toast("Hello world!", Toast.LENGTH_LONG)

2.待续….

项目中的体验

  • 前言:AndroidStudio在下载了Kotlin-android-extension插件后,我们在进行kotlin语言进行编程时如果遇到不会写的代码可以尝试将其用Java语言的代码表达出来,此后你会发现,Java竟然可以直接在kt文件里直接转成kotlin代码(然并卵).

    1.上午将TF-SDK代码全转成了kotlin代码,当然,肯定是遇到了报错的,其中最多的就是关于空类型异常安全在kotlin中的体现:

    项目中的一段Java代码:

private static String[] mapDevs(Context ctx, String device){        String[] devs = null;        final String autoDevName = ctx.getString(R.string.auto_detect_tf);        if (device.equals(autoDevName)){            devs = mAllDevs;        }else {            devs = new String[1];            devs[0] = device;        }        return devs;    }

我们事先声明一个devs的String数组,并用null进行初始化,接着我们在if循环里给其赋值,其中mAllDevs也是一个用null进行初始化的String数组,而在else中我们new出了一个长度为1的数组,并赋值给devs,一切看起来毫无毛病.

接下来,我们将这段拷贝至kt文件,转成kt代码:

private var mAllDevs: Array<String>? = null....var devs: Array<String>? = null        val autoDevName = ctx.getString(R.string.auto_detect_tf)        if (device == autoDevName) {            devs = mAllDevs        } else {            devs = arrayOfNulls<String>(1) //这里竟然报错了??            devs[0] = device        }

错误提示:Type mismatch: Required:Array\? Found:Array\

 private fun mapDevs(ctx: Context, device: String): Array<String> {        var devs: Array<String>?=null        val autoDevName = ctx.getString(R.string.auto_detect_tf)        if (device == autoDevName) {            devs = mAllDevs        } else {           devs= emptyArray<String>()            devs[0] = device        }        return devs!!    }

ok,过了,细细想想,这样在编码期就把空异常给解决了,确实很好用的呢(写起来好累的呢),同时,换个角度想想,Java这种不管3721声明时就赋个null初始化的编码习惯确实…

最后加一句:以上,都是个人观点。

具体关于kotlin关于空异常安全是如何在代码编写中处理的可以参考以下链接以及社区/github中文API:

点我

点我

原创粉丝点击