kotlin第二讲 与 java对比

简介:上一篇介绍了整体开发环境的搭建和使用,本讲将进行一些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.kotlinlearn

import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class 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 = 1
val 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了


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值