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