kotlin第二讲 与 java对比

来源:互联网 发布:mysql引擎是什么 编辑:程序博客网 时间:2024/05/18 02:08

简介:上一篇介绍了整体开发环境的搭建和使用,本讲将进行一些kotlin与java的对比分析。


正文:首先来看一下,代码书写上的差别:(两个都是默认创建的,并没有改动)

package materialdesign.kotlinlearn;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent i = new Intent();        i.setClass(this,Main2Activity.class);        this.startActivity(i);    }}

package materialdesign.kotlinlearnimport android.support.v7.app.AppCompatActivityimport android.os.Bundleclass Main2Activity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main2)    }}

1.继承方式使用:代替了extends,class MainActivity:AppCompatActivity()一定要有(),否则就成了实现了

2.实现的方式使用了 : 代替了 implements ,class MainActivity:AppCompatActivity(), View.OnClickListener ,实现没有()

3.包名不需要和文件夹路径一致的,我们把Main2Activity的包名改到kotlinlearn,在引用出也改一下,不需要切换路径,就可以正常运行。

4.函数声明和返回放到后面(以下函数接受两个 Int 类型参数, 并返回 Int 类型结果:

fun sum(a: Int, b: Int): Int {    return a + b}
5.void 返回使用 Unit 或 不写
fun printSum(a: Int, b: Int) {    print(a + b)}

fun printSum(a: Int, b: Int): Unit {    print(a + b)}

6.语句结尾也不需要 ; 了,怎么越看和groovy语言越像呢?

7.可以使用var来表示局部变量,不需要明确制定类型,(var 和 val)

一次性赋值 (只读) 的局部变量:val a: Int = 1val b = 1   // 变量类型自动推断为 `Int` 类型val c: Int  // 没有初始化语句时, 必须明确指定类型c = 1       // 明确赋值
值可变的变量:var x = 5 // 变量类型自动推断为 `Int` 类型x += 1

8.字符串模版使用规则变化

        var input = "abd"        Log.v("XPC","100 "+input)  //使用java的+拼接        Log.v("XPC","100 :${input}")  //使用新的方式拼接

9.函数的使用方式替换,

一个函数可以这样

fun max(a: Int, b: Int): Int {    if (a > b) {        return a    } else {        return b    }}
也可以这样

fun max(a: Int, b: Int) = if (a > b) a else b
有没有感觉像C的函数指针,看来kotlin是要集各家之所长于一身啊

10.增加了明确区分是否可以指向null的引用,规避了空指针异常的发生。

var a: String = "abc"a = null // 编译错误要允许 null 值, 我们可以将变量声明为可为 null 的字符串, 写作 String?:var b: String? = "abc"b = null // ok


11.instanceOf 替换为 is,而且只要进行过类型检查,后面根本不用强转就可以直接使用。

fun getStringLength(obj: Any): Int? {    if (obj is String) {        // 在这个分支中, `obj` 的类型会被自动转换为 `String`        return obj.length    }    // 在类型检查所影响的分支之外, `obj` 的类型仍然是 `Any`    return null}

12.for循环 也有改变

fun main(args: Array<String>) {    for (arg in args) {        print(arg)    } }或者for (i in args.indices) {    print(args[i])}

13.switch case 可以使用when替换

fun cases(obj: Any) {    when (obj) {        1          -> print("One")        "Hello"    -> print("Greeting")        is Long    -> print("Long")        !is String -> print("Not a string")        else       -> print("Unknown")    }}

14.范围比较

使用 in 运算符检查一个数值是否在某个范围之内:

if (x in 1..y-1) {    print("OK")}

检查一个数值是否在某个范围之外:

if (x !in 0..array.lastIndex) {    print("Out")}

在一个值范围内进行遍历迭代:

for (x in 1..5) {    print(x)}

15.在集合内遍历

在一个集合上进行遍历迭代:

for (name in names) {    println(name)}

使用 in 运算符检查一个集合是否包含某个对象:

if (text in names) { // 将会调用 names.contains(text) 方法    print("Yes")}

使用 Lambda 表达式, 对集合元素进行过滤和变换:

names        .filter { it.startsWith("A") }        .sortedBy { it }        .map { it.toUpperCase() }        .forEach { print(it) }
到此比较了一些常用的使用规则的区别,虽然有些差距但是差距不大,

下面比较一下,java和kt编程成class之后的机器语言的区别。



将我们java中多余启动Activity的部分忽略掉,可以看到其他的部分都是一样的,

唯一不一样的地方是我们的kt文件是 public final 的,what?不能被继承了?

实际上,如果需要被继承,需要使用

open class Main2Activity : AppCompatActivity() {
这样就ok了


原创粉丝点击